Hibernate DetachedCriteria java中的多个结果
这是我的SQL语句Hibernate DetachedCriteria java中的多个结果,java,hibernate,detachedcriteria,Java,Hibernate,Detachedcriteria,这是我的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 我正在尝试执行下面的代码,我认为这相当于hibernate
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
我正在尝试执行下面的代码,我认为这相当于hibernate 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 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或解决方案吗?请尝试在根分离条件上设置结果转换器,如下所示。这将消除重复项
dc.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
请尝试按以下方式在根分离条件上设置结果转换器。这将消除重复项
dc.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
首先,您的SQL看起来不正确。它返回多行的原因是因为您要针对
USER\u LOGIN\u STATUS
表进行加入,该表中每个USER\u PROFILE
可能有多行。由于您没有从USER\u LOGIN\u 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);
我怀疑这对你不起作用的原因是你的子选择
很抱歉,我无法为您提供更多帮助。首先,您的SQL看起来不正确。它返回多行的原因是因为您要针对
USER\u LOGIN\u STATUS
表进行加入,该表中每个USER\u PROFILE
可能有多行。由于您没有从USER\u LOGIN\u 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);
我怀疑这对你不起作用的原因是你的子选择
很抱歉,我无法为您提供更多帮助。我已经尝试了您的代码,但它不起作用。谢谢你的帮助。谢谢你的帮助。我在这里搜索问题,然后我尝试你的代码。它起作用了!这个问题困扰了我半天。我不知道这对关先生没什么帮助,但对我的有帮助。非常感谢。很高兴它帮了你:)我已经试过你的代码,但它不起作用。谢谢你的帮助。谢谢你的帮助。我在这里搜索问题,然后我尝试你的代码。它起作用了!这个问题困扰了我半天。我不知道这对关先生没什么帮助,但对我的有帮助。非常感谢。很高兴它帮助了您:)为什么您在您提供的SQL中没有子查询,却在分离的条件中执行子查询?噢,我很抱歉。我不熟悉这项技术。我真的不知道如何让它在独立的标准下工作。你能帮我找出如何使用我提供的sql在分离的条件下完成它吗?非常感谢。为什么你在你提供的sql中没有子查询,却在分离的条件下执行子查询?哦,我很抱歉。我不熟悉这项技术。我真的不知道如何让它在独立的标准下工作。你能帮我找出如何使用我提供的sql在分离的条件下完成它吗?非常感谢。非常感谢你这么好。我真的很感激。我很肯定这一款会管用的。:)非常感谢你这么好。我真的很感激。我很肯定这一款会管用的。:)