【问题标题】:Hibernate DetachedCriteria multiple results in javajava中的Hibernate DetachedCriteria多个结果
【发布时间】:2013-01-03 04:52:09
【问题描述】:

这是我的 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

我正在尝试执行下面的代码,我认为它等同于休眠 DetachedCriteria 并期望只有两个数据作为结果。

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 或解决方案?

【问题讨论】:

  • 为什么在你提供的 SQL 中没有在分离条件中执行子查询?
  • 哦,我很抱歉。我是这项技术的新手。我真的不知道如何让它以独立的标准工作。你能帮我弄清楚如何使用我提供的 sql 在独立的条件下完成它。非常感谢。

标签: java hibernate detachedcriteria


【解决方案1】:

首先,您的 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);

我怀疑这对您不起作用的原因是您的子选择。

很抱歉,我无法为您提供更多帮助。

【讨论】:

  • 非常感谢你这么好。对此,我真的非常感激。我很确定这个会起作用。 :)
【解决方案2】:

请尝试在您的根分离标准上设置结果转换器,如下所示。这将消除重复。

dc.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);  

【讨论】:

  • 我已经尝试过您的代码,但它不起作用。感谢您的帮助。
  • 感谢您的帮助。我在这里搜索问题,然后尝试您的代码。有用!这个问题困扰了我半天。我不知道它不能帮助 Mr.kwan_ah 但它对我有用。谢谢!
  • 很高兴它帮助了你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
相关资源
最近更新 更多