包含空值的列上的标准API createAlias会终止查询

时间:2016-09-28 17:20:53

标签: java hibernate jpa hibernate-criteria

我有一个名为“Address”的简单实体,它有一些属性和关系由自己定义,一些属性和关系继承自某些超类。

public class Base {
  private UUID id;
  private Date createdAt;
  @NotNull
  private User createdBy;  // User is a related Entity that cannot be null
  private DataImport dataImport;  // DataImport is another related entity that can be null
  //getter & setter
}

public class Address extends Base {
  private String street;
  @NotNull
  private Country country;  // related entity that can't be null
  //getter & setter
}

我想要实现的是使用Criteria API进行一次查询,我想获得一个包含所有简单属性(如street和createdAt)的Address对象列表。同时我只想要相关实体的ID(如果存在):createdBy.id,dataImport.id和country.id。

我几乎使用以下Criteria查询:

entityManager.getDelegate().createCriteria(Address.class).add(criteriaExample)
 .excludeZeroes()
 .createAlias("createdBy", "subcreatedBy")
 .createAlias("country", "subcountry")
 .setProjection(Projections.projectionList().add(Projections.property("id").as("id"))
    .add(Projections.property("createdAt").as("createdAt"))
    .add(Projections.property("street").as("street")).
    .add(Projections.property("subcreatedBy.id").as("createdBy.id"))
    .add(Projections.property("subcountry.id").as("country.id")))
  .setResultTransformer(new AliasToBeanNestedResultTransformer(Address.class));

List<Address> result = criteria.list();

这非常完美!

当我只为dataImport关系添加“别名”时会出现问题。

...createAlias("dataImport", "subdataImport")...

即使没有将DataImport.id的Projection添加到查询中,它也会在我添加此别名后返回一个空列表,即list.size()= 0。

我目前的猜测是,我不能在可以为空的属性上添加别名。有人知道解决方案可能是什么吗?因此,当相关实体不为空时,我想得到它的ID。当没有设置关系时,我希望它只是null。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我应该阅读文档并设置CriteriaSpecification.LEFT_JOIN。

...createAlias("dataImport", "subdataImport", CriteriaSpecification.LEFT_JOIN)...