SpringData查询上可以有多少个“ AND”?

时间:2019-06-06 18:22:18

标签: spring-boot spring-data-jpa spring-data

我创建了此方法:

    Long getAttributesAfterTimeSent(String x, String y, Long timeSent) { 
        return repository.countByXAndYAndZTypesAndTimeSentGreaterThanEqual(
                   x, 
                   y, 
                   new ArrayList<String>() {{ add("attribute1"); add("attribute2"); }}, 
                   timeSent);
    } 

此方法在存储库中的签名如下:

Long countByXAndYAndZTypesAndTimeSentGreaterThanEqual(String x, String y, Collection<String> attributeTypes, timeSent);

运行它时,出现以下错误:

13:18:40.784 [main] INFO  o.h.h.i.QueryTranslatorFactoryInitiator - HHH000397: Using ASTQueryTranslatorFactory
13:18:41.014 [main] WARN  o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 1797, SQLState: 42000
13:18:41.014 [main] ERROR o.h.e.jdbc.spi.SqlExceptionHelper - SQL error: 1797 ORA-01797: this operator must be followed by ANY or ALL

javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet

有指针吗?

2 个答案:

答案 0 :(得分:1)

找出答案。

我的一种类型是非标量类型: ArrayList。

在这种情况下,我们需要在JPA方法中使用 IN 关键字。

因此,从

更改方法时

countByXAndYAndZTypesAndTimeSentGreaterThanEqual

countByXAndYAndZTypesInAndTimeSentGreaterThanEqual

它就像魅力。

答案 1 :(得分:0)

这几乎可以肯定与您方法中AND个短语的数量无关。 该限制仅通过诸如最大方法名称长度,最大查询长度,最大参数数量之类的方式隐含。 它将比任何理智的人试图用单个方法名称填充的内容都要高。

The cause of the exception,您看到的是:

  

原因:   等于运算符=后跟(1,2)之类的多个值

这可能意味着:参数之一或某些属性不是标量类型,而是某种集合或数组。

如果这些方法导致您无法通过方法名称表达某些内容,请使用@Query批注并提供您需要执行的确切查询。