2
Ich habe ziemlich lange nach einer Antwort auf diese Frage gesucht. Folgende Codesmell:wie Sie eine eingebettete Entität mithilfe eines Abfrage-Generators abfragen
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Integer id;
@Column(nullable = true, length = 50)
@Size(max = 50)
private String name;
@Embedded
@Valid
protected Adress adress;
public void setId(Integer id) {
this.id = id;
}
public Integer getId() {
return this.id;
}
public void setName(String name) {
this.name = name;
}
public void getName() {
return this.name;
}
public void setAdress(Adress adress) {
this.adress = adress;
}
public void getAdress() {
return this.adress;
}
}
@Embeddable
public class Adress {
@Column(nullable = false, length = 50)
@Size(max = 50)
@NotNull
private String place;
public void setPlace(String place) {
this.place = place;
}
public void getPlace() {
return this.place;
}
}
public class PersonDaoJpa {
public List<Ort> findByPerson(final Person person) {
CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
CriteriaQuery<Person> query = builder.createQuery(Person.class);
Root<Person> rootPerson = query.from(Person.class);
List<Predicate> wherePredicates = new ArrayList<Predicate>();
if (person.getName() != null) {
wherePredicates.add(builder.like(builder.lower(rootPerson.<String>get("name")), ort.getName().toLowerCase()));
}
Adresse adresse = ort.getAdresse();
if (adresse != null) {
if(adresse.getPlace() != null) {
// this won't work
wherePredicates.add(builder.like(builder.lower(rootPerson.<String>get("person.adress.place")), adresse.getPlace().toLowerCase()));
}
}
Predicate whereClause = builder.and(wherePredicates.toArray(new Predicate[0]));
query.where(whereClause);
return this.entityManager.createQuery(query).getResultList();
}
}
Wie kann ich auf die Adresse.place über rootPerson zugreifen? rootPerson.get ("Ort") oder rootPerson.get ("adress.place") wird nicht funktionieren ...
mit einer kleinen Korrektur, es funktioniert wie ein Charme, danke – myAces
die Korrektur: \t wherePredicates.add (builder.like (builder.lower (rootPerson.get ("Adresse"). get ("Ort")), adresse.getPlace() .toLowerCase())); –
myAces