Hibernate DetachedCriteria多个结果在java中

时间:2013-01-03 04:52:10

标签: java hibernate detachedcriteria

这是我的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. Tom Homer |访客|
  4. Tom Homer |访客|
  5. 有人知道确切的等效DetachedCriteria或解决方案吗?

    非常感谢,

    xtian

2 个答案:

答案 0 :(得分: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);

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

抱歉,我无法帮到你。

答案 1 :(得分:0)

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

dc.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);