这是我的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或解决方案吗?
非常感谢,
xtian
答案 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);
现在大致相当,但我假设:
UserField
和UserLoginStatus
之间的关系有正确的映射。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);