【问题标题】:How to write sum query in jpa?如何在 jpa 中编写求和查询?
【发布时间】:2019-12-05 09:57:26
【问题描述】:

我在 mySql 中有一个查询,我想在我的控制器中编写。

SELECT sum(`column`='value') ,b.`date`  FROM table b WHERE b.user= 'user1' and b.`date` between '2019-07-21' and '2019-07-26' group by b.`date`

这是 jpa 中的等价物

@Transactional
@Modifying
@Query("SELECT sum(column='value') ,b.date  FROM myclasse b WHERE b.user= :user and b.date between :dt1 and :dt2 group by b.date")
    List<Object[]> function( String user,@Param("dt1")Date dt1,@Param("dt2")Date dt2);

我希望得到与 phpmyadmin 结果相同的结果,但我收到此错误:

引起:java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException:期待关闭, 在第 1 行第 23 列附近找到 '=' [SELECT SUM(column='value') ,b.date FROM com.project.Myclass b WHERE b.user= :user 和 b.date 之间 :dt1 和 :dt2 按 b.date 分组] 在 org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:138) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final] 在 org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final] 在 org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final] 在 org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:729) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final] 在 org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:23) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) ~[na:1.8.0_161] 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) ~[na:1.8.0_161] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) ~[na:1.8.0_161] 在 java.lang.reflect.Method.invoke(未知来源) ~[na:1.8.0_161] 在 org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:350) ~[spring-orm-5.1.8.RELEASE.jar:5.1.8.RELEASE] 在 com.sun.proxy.$Proxy118.createQuery(Unknown Source) ~[na:na] at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:87) ~[spring-data-jpa-2.1.9.RELEASE.jar:2.1.9.RELEASE] ... 76 常见 框架省略

【问题讨论】:

    标签: java mysql jpa spring-data-jpa jpql


    【解决方案1】:

    将布尔表达式替换为CASE 表达式:

    SELECT
        b.date,
        COUNT(CASE WHEN some_col = 'some_value' THEN 1 END) AS cnt
    FROM table_b b
    WHERE b.user = 'user1' AND b.date BETWEEN '2019-07-21' AND '2019-07-26' 
    GROUP BY b.date;
    

    sum(column = 'value') 语法是 MySQL 特有的(可能还有一些其他数据库,如 Postgres),但 JPA 似乎不支持。

    【讨论】:

      猜你喜欢
      • 2011-03-22
      • 2013-09-05
      • 2012-11-01
      • 2012-05-30
      • 2021-05-01
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多