Java 如何使用查询生成器查询嵌入式实体

Java 如何使用查询生成器查询嵌入式实体,java,eclipselink,hsqldb,Java,Eclipselink,Hsqldb,我找了好长时间才找到这个问题的答案。以下代码气味: @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 Adr

我找了好长时间才找到这个问题的答案。以下代码气味:

@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();
 }
}
@实体
公共阶层人士{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
受保护的整数id;
@列(nullable=true,长度=50)
@尺寸(最大值=50)
私有字符串名称;
@嵌入
@有效的
保护地址;
公共无效集合id(整数id){
this.id=id;
}
公共整数getId(){
返回此.id;
}
公共void集合名(字符串名){
this.name=名称;
}
public void getName(){
返回此.name;
}
公共无效设置地址(地址地址){
this.address=地址;
}
公共无效GetAddress(){
返回此地址;
}
}
@可嵌入
公共类地址{
@列(nullable=false,长度=50)
@尺寸(最大值=50)
@NotNull
私人弦乐场;
公共无效设置位置(字符串位置){
这个地方=地方;
}
公共场所(){
把这个地方还给我;
}
}
公营人员{
公共列表查找人员(最终人员){
CriteriaBuilder=this.entityManager.getCriteriaBuilder();
CriteriaQuery=builder.createQuery(Person.class);
Root rootPerson=query.from(Person.class);
List wherePredicates=new ArrayList();
if(person.getName()!=null){
wherePredicates.add(builder.like(builder.lower(rootPerson.get(“name”)),ort.getName().toLowerCase());
}
Adresse ADRESE=ort.GetADRESE();
如果(地址!=null){
if(address.getPlace()!=null){
//这行不通
wherePredicates.add(builder.like(builder.lower(rootPerson.get(“person.address.place”)),adrese.getPlace().toLowerCase());
}
}
谓词whereClause=builder.and(wherePredicates.toArray(新谓词[0]);
查询。何处(何处条款);
返回此.entityManager.createQuery(query.getResultList();
}
}

如何通过rootPerson访问address.place?rootPerson.get(“地点”)或rootPerson.get(“地址.地点”)不起作用…

我认为这可能会起作用:


wherePredicates.add(builder.like(builder.lower(rootPerson.get(“address”).get(“place”)),address.getPlace().toLowerCase())

更正:wherePredicates.add(builder.like(builder.lower(rootPerson.get(“address”).get(“place”)、address.getPlace().toLowerCase());