2017-07-25 2 views
0

Ich habe eine Klasse, die einen Benutzer Geburtsdatum in zwei getrennten FeldernProjektion schaffen neues Feld

public class User { 
    private int yearOfBirth; 
    private int monthOfBirth; 
} 

Ist es möglich, einen Vorsprung zu machen bedeutet, dass der Benutzer Alter exportiert? Ich weiß, wir können Felder mit @Value verketten.

Antwort

0

Der einfachste Weg, um das Problem zu lösen (wenn Sie Code in die Domain-Klasse hinzufügen) ist ein Verfahren, in dem Benutzer hinzufügen Klasse wie unten:

@JsonIgnore 
public int getAge() { 
    return Period.between(
      LocalDate.of(dobYear, dobMonth, 1), 
      LocalDate.now() 
    ).getYears(); 
} 

Sie können die @JsonIgnore zu blockieren Feder von Export ein „Alter“ Feld hinzufügen, wenn Ihr Unternehmen serialisiert wird. Nach dieser Methode hinzufügen, können Sie Projektion wie die unten erstellen:

@Projection(name = "userAge ", types = {User.class}) 
public interface UserAge { 

    @Value("#{target.getAge()}") 
    Integer getAge(); 

} 
0

So etwas wie dies, zum Beispiel:

public class UserAgeDto { 
    private int yearOfBirth; 
    private int monthOfBirth; 

    public UserAgeDto(int yearOfBirth, int monthOfBirth) { 
     // constructor implementation... 
    } 

    public int getAge() { 
     // age calculation... 
    } 
} 

public interface UserRepo extends JpaRepository<User, Long> { 

    @Query("select new com.example.myapp.dto.UserAgeDto(u.yearOfBirth, u.monthOfBirth) from User u where u = ?") 
    UserAgeDto getUserAgeDto(User user); 
} 

Einige info

+0

Danke @ Cepr0, aber ich war auf der Suche nach einem Weg, dies mit einer Projektion zu tun –

+0

Sie UserAgeDto als Projektion verwenden, wie in der gezeigt Code. –

+0

@RafaelTeles Sie sollten mehr Informationen geben - was genau Sie brauchen, zeigen Sie Ihre Entitäten/Repo, eine Vorlage des Ergebnisses, das Sie brauchen ... – Cepr0