首页 > 解决方案 > 用spring数据点燃jpa使用语法IN

问题描述

当我将 JPA 与 一起使用时IN,它会导致一些问题,我该如何解决?我对表达感到困惑吗 IN?[*]?谢谢

ignite:2.7.6
spring jpa:ignite-spring-data_2.0
spring boot:2.0.9.RELEASE
h2:1.4.197

jpa 方法:列出 findByShipVisitIdIsIn(List shipVisitIdList); 或 findByShipVisitIdIn。

第一种方法“findByArrivedTimeGreaterThanEqualAndArrivedTimeLessThanEqual”工作正常

@RepositoryConfig(cacheName = "BerthplanShipVisitCache")
public interface BerthplanShipVisitRepository extends IgniteRepository<BerthplanShipVisit, String>, 
HdShipIdRepository<BerthplanShipVisit, String> {

List<BerthplanShipVisit> findByArrivedTimeGreaterThanEqualAndArrivedTimeLessThanEqual(Timestamp start, Timestamp end);

List<BerthplanShipVisit> findByShipVisitIdIsIn(List<String> shipVisitIdList);

}

SQL是由插件自动生成的ignite-spring-data,我猜它在和之间ignite-spring-data有问题h2

问题跟踪:

Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "SELECT ""BerthplanShipVisitCache"".""BerthplanShipVisit""._KEY, ""BerthplanShipVisitCache"".""BerthplanShipVisit""._VAL FROM ""BerthplanShipVisit"" WHERE ((""BerthplanShipVisit"".""shipVisitId"" IN ?[*]))"; expected "("; SQL statement:
SELECT "BerthplanShipVisitCache"."BerthplanShipVisit"._KEY, "BerthplanShipVisitCache"."BerthplanShipVisit"._VAL FROM "BerthplanShipVisit" WHERE (("BerthplanShipVisit"."shipVisitId" IN ?)) [42001-197]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:357)
    at org.h2.message.DbException.getSyntaxError(DbException.java:217)
    at org.h2.command.Parser.getSyntaxError(Parser.java:555)
    at org.h2.command.Parser.read(Parser.java:3518)
    at org.h2.command.Parser.readCondition(Parser.java:2433)
    at org.h2.command.Parser.readAnd(Parser.java:2342)
    at org.h2.command.Parser.readExpression(Parser.java:2334)
    at org.h2.command.Parser.readTerm(Parser.java:3252)
    at org.h2.command.Parser.readFactor(Parser.java:2587)
    at org.h2.command.Parser.readSum(Parser.java:2574)
    at org.h2.command.Parser.readConcat(Parser.java:2544)
    at org.h2.command.Parser.readCondition(Parser.java:2370)
    at org.h2.command.Parser.readAnd(Parser.java:2342)
    at org.h2.command.Parser.readExpression(Parser.java:2334)
    at org.h2.command.Parser.readTerm(Parser.java:3252)
    at org.h2.command.Parser.readFactor(Parser.java:2587)
    at org.h2.command.Parser.readSum(Parser.java:2574)
    at org.h2.command.Parser.readConcat(Parser.java:2544)
    at org.h2.command.Parser.readCondition(Parser.java:2370)
    at org.h2.command.Parser.readAnd(Parser.java:2342)
    at org.h2.command.Parser.readExpression(Parser.java:2334)
    at org.h2.command.Parser.parseSelectSimple(Parser.java:2291)
    at org.h2.command.Parser.parseSelectSub(Parser.java:2133)
    at org.h2.command.Parser.parseSelectUnion(Parser.java:1946)
    at org.h2.command.Parser.parseSelect(Parser.java:1919)
    at org.h2.command.Parser.parsePrepared(Parser.java:463)
    at org.h2.command.Parser.parse(Parser.java:335)
    at org.h2.command.Parser.parse(Parser.java:311)
    at org.h2.command.Parser.prepareCommand(Parser.java:278)
    at org.h2.engine.Session.prepareLocal(Session.java:611)
    at org.h2.engine.Session.prepareCommand(Session.java:549)
    at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1247)
    at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:76)
    at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:694)
    at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.prepare0(IgniteH2Indexing.java:539)
    at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.prepareStatement(IgniteH2Indexing.java:509)
    at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.prepareStatement(IgniteH2Indexing.java:476)
    at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.prepareStatementAndCaches(IgniteH2Indexing.java:2635)
    ... 89 common frames omitted

标签: javaspring-bootspring-dataignite

解决方案


最后,我编辑源代码 org.apache.ignite.springdata20.repository.query.IgniteRepositoryQuery prepareQuery 方法。在里面,对待'IN?到 'IN (?,?)' ,参数也变平了。这似乎没问题。


推荐阅读