@Query 标记中的嵌套 SQL 无法正常工作
Nested SQL in @Query tag is not working properly
假设我有一个table,其中包含用户和类型的所有帐户。
我想创建一个 Jpa Repository 方法,其中 returns 是每种类型用户(USER、ADMIN、MASTER)总数的数组。
这是我在 JpaRepository 中的做法:
@Query(value="SELECT (SELECT COUNT(*) FROM account WHERE account_role='USER'),"
+ "(SELECT COUNT(*) FROM account WHERE account_role='ADMIN'),"
+ "(SELECT COUNT(*) FROM account WHERE account_role='MASTER')"
+ "FROM account LIMIT 1",
nativeQuery=true)
public List<Integer> getTotalAccountType();
代码执行的很好,但结果不是我所期望的。
结果:
[2]
预期结果:[2,10,30]
知道如何将嵌套 SQL 与 JPQL 一起使用吗?提前致谢!
尝试返回 Object[]
而不是 List<Integer>
。我认为返回 List<Integer>
表示正在返回 Integer
值的多行,而您返回的是包含多个 Intger
列的一行。
从结果 Object[]
中,您将提取第一个值(表示一行)。这应该是另一个 Object[]
,它将按照返回的顺序返回您的值。
您也可以删除最后 "FROM account LIMIT 1"
行,因为它与结果无关。
我建议将所有这些都转换为一个对象。如这里所见-
如果存储库方法returns 整数列表,则表示查询结果行包含一个整数值。但是您希望在一行中获得整数序列。
你可以用不同的方式得到相同的结果:
@Query(value="SELECT COUNT(*) FROM account WHERE account_role=?", nativeQuery=true)
public Integer getTotalAccountType(String role);
然后:
Integer userCount = repository.getTotalAccountType("USER");
Integer adminCount = repository.getTotalAccountType("ADMIN");
Integer masterCount = repository.getTotalAccountType("MASTER");
或者如果您有映射的实体:
- 使用构造函数
Pair(K key, V value)
创建 Pair<K,V>
class 或从任何 external library 使用它
基于hql查询的repository方法
@Query(value="select new javafx.util.Pair(a.accountRole, count(a)) from Account a group by a.accountRole")
public List<Pair<String, Integer>> getRoleCountList();
将存储库结果转换为服务中的 Map<String, Integer>
javafx.util.Pair<String, Integer> result = repository.getRoleCountList();
Map<String, Integer> map = result.stream().collect(Collectors.toMap(r-> r.getKey(), r-> r.getValue()));
假设我有一个table,其中包含用户和类型的所有帐户。 我想创建一个 Jpa Repository 方法,其中 returns 是每种类型用户(USER、ADMIN、MASTER)总数的数组。
这是我在 JpaRepository 中的做法:
@Query(value="SELECT (SELECT COUNT(*) FROM account WHERE account_role='USER'),"
+ "(SELECT COUNT(*) FROM account WHERE account_role='ADMIN'),"
+ "(SELECT COUNT(*) FROM account WHERE account_role='MASTER')"
+ "FROM account LIMIT 1",
nativeQuery=true)
public List<Integer> getTotalAccountType();
代码执行的很好,但结果不是我所期望的。
结果:
[2]
预期结果:[2,10,30]
知道如何将嵌套 SQL 与 JPQL 一起使用吗?提前致谢!
尝试返回 Object[]
而不是 List<Integer>
。我认为返回 List<Integer>
表示正在返回 Integer
值的多行,而您返回的是包含多个 Intger
列的一行。
从结果 Object[]
中,您将提取第一个值(表示一行)。这应该是另一个 Object[]
,它将按照返回的顺序返回您的值。
您也可以删除最后 "FROM account LIMIT 1"
行,因为它与结果无关。
我建议将所有这些都转换为一个对象。如这里所见-
如果存储库方法returns 整数列表,则表示查询结果行包含一个整数值。但是您希望在一行中获得整数序列。
你可以用不同的方式得到相同的结果:
@Query(value="SELECT COUNT(*) FROM account WHERE account_role=?", nativeQuery=true)
public Integer getTotalAccountType(String role);
然后:
Integer userCount = repository.getTotalAccountType("USER");
Integer adminCount = repository.getTotalAccountType("ADMIN");
Integer masterCount = repository.getTotalAccountType("MASTER");
或者如果您有映射的实体:
- 使用构造函数
Pair(K key, V value)
创建Pair<K,V>
class 或从任何 external library 使用它
基于hql查询的repository方法
@Query(value="select new javafx.util.Pair(a.accountRole, count(a)) from Account a group by a.accountRole") public List<Pair<String, Integer>> getRoleCountList();
将存储库结果转换为服务中的
Map<String, Integer>
javafx.util.Pair<String, Integer> result = repository.getRoleCountList(); Map<String, Integer> map = result.stream().collect(Collectors.toMap(r-> r.getKey(), r-> r.getValue()));