2011-01-16 3 views
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") 작동하지 않습니다 ...

답변

2

나는이 작업을 거라고 생각 : 작은 보정

wherePredicates.add(builder.like(builder.lower(rootPerson.<String>get("adress").get("place")), adresse.getPlace().toLowerCase()));

+0

, 매력처럼 작동합니다. – myAces

+1

수정 : \t 여기서, Adresse.getPlace(), adresse.getPlace(), addres.add (builder.like .toLowerCase())); – myAces

관련 문제