java - 如何使用查询构建器查询嵌入式实体

标签 java eclipselink hsqldb

我已经搜索了很长时间来寻找这个问题的答案。遵循 Codesmell:

@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("place") 或 rootPerson.get("adress.place") 将不起作用...

最佳答案

我认为这可能有效:

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

关于java - 如何使用查询构建器查询嵌入式实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4707553/

相关文章:

java - 如何从抽象类实现泛型字段?

json - @XmlInverseReference 注释不起作用

java - 为什么 Hibernate 将架构名称添加到 Hsql 函数中?

jdbc - 插入时更新 hsqldb

java - Android 谷歌地图 + Pusher(实时)监听器

java - org.apache.jasper.JasperException : java. lang.NumberFormatException:null

java - 如何在数据库版本之间进行JPA更新?

java - HSQLDB 内部 : Hibernate and Integer vs Long Ids

java - Mac 操作系统,Java 飞溅

eclipselink - TopLink 11g 与 EclipseLink