Hibernate select distinct return 只有 id
Hibernate select distinct return only id
class Cat {
long id;
String name;
int age
}
List<Cat> results = (List<Cat>) session.createCriteria(Cat.class)
.setProjection( Projections.projectionList()
.add( Projections.distinct(Projections.property("id")) )
)
.list();
它在没有设置投影的情况下工作得很好,但有重复的 id。
当我们添加集合投影时,查询 return only a list if ids(1, 2, 3).
如何更改为 return 猫列表且 id 不重复?
一种选择是对条件对象使用 setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
。但它不是在数据库端实现的——它是通过编程过滤的(在触发数据库查询后,Hibernate 过滤不同的行)。
另一个更好的选择是使用 setResultTransformer(new AliasToBeanResultTransformer(Cat.class))
并且您需要像上面那样使用具有不同的投影,并且还要对要填充到 Cat 实体中的所有属性进行投影。这在 SQL 查询中使用了不同的关键字,因此过滤发生在数据库中)
您可以通过此 hibernate forum - select distinct entities using Criteria 获取相关讨论的示例和更多信息。
class Cat {
long id;
String name;
int age
}
List<Cat> results = (List<Cat>) session.createCriteria(Cat.class)
.setProjection( Projections.projectionList()
.add( Projections.distinct(Projections.property("id")) )
)
.list();
它在没有设置投影的情况下工作得很好,但有重复的 id。 当我们添加集合投影时,查询 return only a list if ids(1, 2, 3).
如何更改为 return 猫列表且 id 不重复?
一种选择是对条件对象使用 setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
。但它不是在数据库端实现的——它是通过编程过滤的(在触发数据库查询后,Hibernate 过滤不同的行)。
另一个更好的选择是使用 setResultTransformer(new AliasToBeanResultTransformer(Cat.class))
并且您需要像上面那样使用具有不同的投影,并且还要对要填充到 Cat 实体中的所有属性进行投影。这在 SQL 查询中使用了不同的关键字,因此过滤发生在数据库中)
您可以通过此 hibernate forum - select distinct entities using Criteria 获取相关讨论的示例和更多信息。