java - @Query 标签中的嵌套 SQL 无法正常工作

标签 java sql hibernate spring-data-jpa jpql

假设我有一个表,其中包含用户和类型的所有帐户。 我想创建一个 Jpa 存储库方法,它返回每种类型用户(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 结合使用吗?预先感谢您!

最佳答案

如果存储库方法返回整数列表,则意味着查询结果行包含整数值。但您希望在一行中获得整数序列。

您可以通过不同的方式获得相同的结果:

@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");

或者如果您有映射实体:

  1. 创建Pair<K,V>具有构造函数的类Pair(K key, V value)或从任何 external library 使用它
  2. 基于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();

  3. 将存储库结果转换为 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()));

关于java - @Query 标签中的嵌套 SQL 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57116373/

相关文章:

java - Hibernate OneToMany 关联表字段对于repository.save(entityModel) 不能为空

mysql - 如何优化 Web 应用程序中从数据库中提取请求?

java - Netbeans:是否可以使用比捆绑版本更新的 JUnit 版本?

java - logback:如何设置每个线程的日志记录级别?

python - Sqlite3 - 使用 Python 代码更新表 - %s 附近的语法错误

c# - 尝试将文件路径保存到数据库时出错

java - 如何在 MySql 时间戳中存储 java 日历时间?

java - ArrayList<Integer> 接受字符串

php - 我不知道我的 SQL 连接出了什么问题,这是我第一次使用它

java - 使用 UUID 作为 Hibernate 主键 id 是否被认为是糟糕的设计?