Hibernate DetachedCriteria多个结果导致java
这是我的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
而我正在尝试执行下面的代码,我认为这相当于hibernateDetachedCriteria并且预计只有两个数据作为结果。
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
首先,您的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);
我怀疑这不适合你的原因是因为你的子选择。
对不起,我帮不了你。
请尝试按照以下方法在根分离标准上设置结果转换器。 这将消除重复。
dc.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);