这是我拥有的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);
现在大致相等,但我假设:
您具有
UserField
和UserLoginStatus
之间的关系的正确映射。该
getDetachedCriteria()
实际上是返回DetachedCriteria.forClass(UserField.class)
。现在,您还可以这样引用
UserLoginStatus
中的字段:dc.add(Projections.property("uls.my_user_login_field"));
同样,如果您整理出查询后仍然返回多个实体,那么dinukadev的答案将起作用:
dc.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
我怀疑这对您不起作用的原因是您的子选择。
抱歉,我不能为您提供更多帮助。