2
나는이 질문에 대한 답변을 꽤 많이 검색했습니다. 팔로 잉 코드 :쿼리 작성기를 사용하여 포함 된 엔터티를 쿼리하는 방법
@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();
}
}
어떻게 rootPerson을 통해 Adress.place에 액세스 할 수 있습니까? rootPerson.get ("장소"), 또는 rootPerson.get ("adress.place") 작동하지 않습니다 ...
, 매력처럼 작동합니다. – myAces
수정 : \t 여기서, Adresse.getPlace(), adresse.getPlace(), addres.add (builder.like .toLowerCase())); – myAces