1

这是我拥有的 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 或解决方案?

4

2 回答 2

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);

这现在大致等效,但我假设:

  • UserField对于和之间的关系,您有正确的映射UserLoginStatus
  • getDetachedCriteria()实际上是返回DetachedCriteria.forClass(UserField.class)

您现在也可以UserLoginStatus这样引用字段:

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

同样,如果您的查询得到整理并且您仍然返回多个实体,那么 dinukadev 的答案将发挥作用:

dc.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

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

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

于 2013-01-08T09:32:47.440 回答
0

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

dc.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);  
于 2013-01-04T03:55:17.283 回答