这是我拥有的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);


但不幸的是,这是出乎意料的结果:我有多个数据结果。

姓名|类型


本·琼斯|用户|
本·琼斯|用户|
汤姆·荷马|访客|
汤姆·荷马|访客|


有谁知道确切的等效DetachedCriteria或对此的解决方案?

最佳答案

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


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

抱歉,我不能为您提供更多帮助。

10-06 05:35