Hibernate DetachedCriteria多个结果导致java

这是我的SQL语句。

SELECT USER_PROFILE.FIRST_NAME, USER_PROFILE.LAST_NAME, USER_PROFILE.USER_TYPE FROM USER_PROFILE INNER JOIN USER_LOGIN_STATUS ON USER_PROFILE.USER_ID=USER_LOGIN_STATUS.USER_ID ORDER BY USER_PROFILE.FIRST_NAME 

而我正在尝试执行下面的代码,我认为这相当于hibernateDetachedCriteria并且预计只有两个数据作为结果。

 DetachedCriteria dc = getDetachedCriteria(); DetachedCriteria userLoginCriteria = DetachedCriteria.forClass(UserLoginStatus.class); userLoginCriteria.setProjection(Projections.distinct(Projections.property("userId"))); dc.add(Subqueries.propertyIn(UserField.id.name(), userLoginCriteria)); DetachedCriteria profileCriteria = dc.createCriteria("profile"); profileCriteria.addOrder(Order.asc("firstName")); return getAll(dc, pageSetting); 

但不幸的是,这是意想不到的结果:我有一个多数据结果。

名称| 输入|

  1. 本琼斯| 用户|
  2. 本琼斯| 用户|
  3. 汤姆荷马| 嘉宾|
  4. 汤姆荷马| 嘉宾|

有人知道确切的等效DetachedCriteria或解决方案吗?

非常感谢,

xtian

首先,您的SQL看起来不正确。 它返回多行的原因是因为您要加入USER_LOGIN_STATUS表,每个USER_PROFILE可能有多行。 因为您没有USER_LOGIN_STATUS表中选择任何字段,所以您无法看到为什么有多行。 你为什么一开始就加入这张桌子?

其次,您执行的分离标准与您提供的SQL不同,因为您正在执行不在SQL中的子查询。

你不需要这个子选择,因为我不明白为什么你在做连接我会假设一些要点给你以下的例子:

 DetachedCriteria dc = getDetachedCriteria(); dc.createAlias("userLoginStatus", "uls"); dc.add(Projections.property("firstName")); dc.add(Projections.property("lastName")); dc.add(Projections.property("userType")); dc.addOrder(Order.asc("firstName")); return getAll(dc, pageSetting); 

这现在大致相当,但我假设:

  • 您具有UserFieldUserLoginStatus之间关系的正确映射。
  • getDetachedCriteria()实际上返回DetachedCriteria.forClass(UserField.class)

您现在也可以在UserLoginStatus引用一个字段,如下所示:

 dc.add(Projections.property("uls.my_user_login_field")); 

而且,如果您将查询排序并且仍然返回多个实体,那么dinukadev的答案将会发挥作用:

 dc.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 

我怀疑这不适合你的原因是因为你的子选择。

对不起,我帮不了你。

请尝试按照以下方法在根分离标准上设置结果转换器。 这将消除重复。

 dc.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
Interesting Posts