在spring data jpa中查找不同结果

x4shl7ld  于 2022-12-26  发布在  Spring
关注(0)|答案(2)|浏览(171)

我正在尝试获取Distinct记录,SQL查询如下所示

select DISTINCT id from Table A where UserId = 'XXXX';

目前,我已经使用spring data jpa @Query实现了这一点

@Query(value = "select DISTINCT id from Table A where UserId = :userId")

这可以通过spring data jpa查询方式实现吗?

vzgqcmou

vzgqcmou1#

是的,可以。你可以使用Sping Boot 查询构建器(见这里)来得到一个简单的查询。在你的例子中,查询方法看起来像这样:

List<Long> findDistinctIdByUserId(String userId);

使用Long只是为了防止您在数据库中使用数字ID-当然,它可以是String或任何其他数据类型(如果适用)。我也选择将userId键入为String。“findDistinct”是从表中选择所有不同结果的前缀,下一个单词是列名。“byColumnName”是添加相关Where子句的后缀(它应该与方法的输入参数相关)。

wixjitnu

wixjitnu2#

关于Distinct和JPA,您可以在本文中找到相关信息:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation

表3.方法名称中支持的关键字

不同(关键字)findDistinctByLastnameAndFirstname(示例)选择不同...其中x.姓氏=?1,x.名字=?2(JPQL代码段)
因此,您只能使用JPA关键字创建这种类型的不同请求:
选择不同的x.id、x.姓氏、x.名字x.创建日期、x.用户ID,其中x.姓氏=?1,x.名字=?2
但不要选择distinct x.userId where x.id =?1作为问题作者希望(在本例中,您将收到)的错误,因为原始sql语句已经:
选择不同的x.id、x.姓氏、x.名字、x.创建日期、x. userId....其中x.id =?1
发生Map异常。
JPA中有一个关于Distinct的重大警告
DISTINCT可能比较复杂,并不总是能产生预期的结果。例如,从用户u中选择distinct u与从用户u中选择distinct u.lastname会产生完全不同的结果。在第一种情况下,由于您包含了User.id,因此不会复制任何内容,因此您将获得整个表,并且它将是用户对象。但是,后一个查询会将焦点缩小到User.lastname,并查找该表的所有唯一姓氏。这也会产生List结果集,而不是List结果集。countDistinctByLastname(String lastname)也会产生意外的结果u.id。用户u,其中u.lastname =?1.同样,由于u.id不会命中任何重复项,此查询将统计具有绑定姓氏的所有用户。这与countByLastname相同(字符串lastname)!这个查询到底有什么意义?找到具有给定姓氏的人数?找到具有绑定姓氏的不同人数?要查找不同姓氏的数量吗?(最后一个查询是完全不同的查询!)使用distinct有时需要手工编写查询,并使用**@Query来最好地捕获您要查找的信息,因为您可能还需要投影**来捕获结果集。
重点突出显示,因此仅使用JPA关键字是不够的

相关问题