我创建了此方法:
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
有指针吗?
答案 0 :(得分:1)
找出答案。
我的一种类型是非标量类型: ArrayList。
在这种情况下,我们需要在JPA方法中使用 IN 关键字。
因此,从
更改方法时 countByXAndYAndZTypesAndTimeSentGreaterThanEqual
到
countByXAndYAndZTypesInAndTimeSentGreaterThanEqual
它就像魅力。
答案 1 :(得分:0)
这几乎可以肯定与您方法中AND
个短语的数量无关。
该限制仅通过诸如最大方法名称长度,最大查询长度,最大参数数量之类的方式隐含。
它将比任何理智的人试图用单个方法名称填充的内容都要高。
The cause of the exception,您看到的是:
原因: 等于运算符=后跟(1,2)之类的多个值
这可能意味着:参数之一或某些属性不是标量类型,而是某种集合或数组。
如果这些方法导致您无法通过方法名称表达某些内容,请使用@Query
批注并提供您需要执行的确切查询。