使用JPA在Sql中具有不同值的多个语句where子句

Posted

技术标签:

【中文标题】使用JPA在Sql中具有不同值的多个语句where子句【英文标题】:Multiples statements where clause with differents values in Sql using JPA 【发布时间】:2018-10-23 08:39:52 【问题描述】:

大家好,我正在使用 JPA 为我的项目进行本机查询,但我不知道如何执行 if 和 else 在 where 子句中,我的 ?0 可以是 4 个值:10、20、30 和 40,当 ?0 是 10、20、30 时,我应该使用 CI.QTD = 。我怎样才能做到这一点?

在一个条件下遵循我的代码:

SELECT rownum AS id, 
       x.* 
FROM   ( 
                SELECT   ci.text, 
                         ci.lenght 
                FROM     ci_table CI

                WHERE    (?0 IS NULL OR ci.qtd <= ?0) 

                GROUP BY ci.text, 
                         ci.lenght 
                ORDER BY ci.text) x , 
       nativequery = true);

在调整后添加查询:

@Query(value =
            "SELECT rownum as ID, X.* FROM (SELECT " +
                    " CI.PARAM1  " +
                    " CI.PARAM2,  " +
                    " CI.PARAM3,         " +
                    " CI.PARAM4, " +
                    " CI.PARAM5" +
                    " FROM    " +
                    " CM_PARAMS CI " +
                    " WHERE  " +
                    " (?1 is null or CI.PARAM6 = ?1) " +
                    " AND (?2 is null or CI.PARAM7 = ?2) " +
                    " AND (?3 is null or CI.PARAM8 = ?3) " +
                    " AND (?4 is null or CI.PARAM9 = ?4) " +
                    " AND (?5 is null or CI.PARAM10 = ?5) " +
                    " AND (?6 is null or CI.PARAM11 = ?6) " +
                    " AND (?7 is null or CI.PARAM12 = ?7) " +
                    " AND (?8 is null or CI.PARAM13 = ?8) " +
                    " AND (CASE WHEN ?9 >30 THEN CI.PARAM14 > 30  " +
                    "  CASE WHEN ?9 <31 THEN CI.PARAM15 <= ?9 END) = 1 " +
                    " GROUP BY " +
                    " CI.PARAM1,  " +
                    " CI.PARAM2,  " +
                    " CI.PARAM3,         " +
                    " CI.PARAM4, " +
                    " CI.PARAM5" +
                    " ORDER BY  " +
                    " CI.PARAM1 ASC) X " , nativeQuery = true)

【问题讨论】:

使用case statement case 表达式... 【参考方案1】:

试试:

SELECT rownum AS id, 
       x.* 
FROM   ( 
                SELECT   ci.text, 
                         ci.lenght
                FROM     ci_table CI

                WHERE (CASE WHEN ?0 IN (10,20,30) THEN CI.QTD <= ?0
                      WHEN ?0 = 40 THEN CI.QTD > ?0 END) = 1

                GROUP BY ci.text, 
                         ci.lenght 
                ORDER BY ci.text) x , 
       nativequery = true);

【讨论】:

您好,感谢您回答我的问题。我正在尝试使用: AND (?8 is null or CI.TEST= ?8) AND (CASE WHEN ?9 >30 THEN CI.QTD > 30 CASE WHEN ?9 这个查询是在哪个数据库上触发的?另外,请粘贴您的整个查询。 我使用的是 Oracle 数据库,我在这里添加了实际代码。再次感谢。 检查我编辑的答案。在END 之后添加= 1。尝试在您的查询中进行此更改并告诉我。 同样的错误信息。您是否在帖子中看到了整个查询? org.springframework.dao.InvalidDataAccessResourceUsageException:无法提取结果集; SQL [不适用];嵌套异常是 org.hibernate.exception.SQLGrammarException: could not extract ResultSet --- ORA-00905: missing keyword

以上是关于使用JPA在Sql中具有不同值的多个语句where子句的主要内容,如果未能解决你的问题,请参考以下文章

SQL 中 where 条件中 in 后面 加 CASE WHEN 语句 报错

SQL语句where多条件查询怎么写?

oracle SQL查询中,如何在where中用条件语句,判断不同情况,追加不同的And条件?

使用名为查询的数据 jpa 返回具有不同列值的行

SQL Server 更新语句基于具有多个值的 Select 语句

jpa动态sql