简体   繁体   English

将 function 结果集映射到 JPA 的 Pojos 列表中

[英]Mapping function result set into List of Pojos with JPA

I have the following PostgreSQL function:我有以下 PostgreSQL function:

CREATE OR REPLACE FUNCTION getFirstNAvailableSlots(N INTEGER, timestamp_start TIMESTAMP, timestamp_end TIMESTAMP,
cpu INTEGER, max_reservable_cpu INTEGER)
returns TABLE (t_start TIMESTAMP, t_end TIMESTAMP)

I would like to call the function, and automatically map the result set into a List of TimeSlots:我想调用 function,并自动将 map 的结果集放入 TimeSlots 列表中:

public class TimeSlot {

    private Timestamp t_start;
    private Timestamp t_end;
}

So I added a Query in a repository:所以我在存储库中添加了一个查询:

public interface WorkstationReservationRepository extends ReservationBaseRepository<WorkstationReservation>{

    @Query(value="SELECT new com.warden.reservationmicroservice.dtos.TimeSlot(t_start,t_end) FROM getFirstNAvailableSlots(:N,:t_start,:t_end,:cpu,:max_reservable_cpu)")
    public List<TimeSlot> getFirstNAvailableSlots(@Param("N")int N, @Param("t_start")Timestamp t_start, @Param("t_end")Timestamp t_end, @Param("cpu") int cpu, @Param("max_reservable_cpu")int max_reservable_cpu);

}

However, I get the following error:但是,我收到以下错误:

Caused by: java.lang.IllegalArgumentException: Validation failed for query for method public abstract com.warden.reservationmicroservice.dtos.TimeSlot com.warden.reservationmicroservice.repositories.WorkstationReservationRepository.getFirstNAvailableSlots(int,java.sql.Timestamp,java.sql.Timestamp,int,int) at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:100) ~[spring-data-jpa-3.0.0.jar:3.0.0] at org.springframework.data.jpa.repository.query.SimpleJpaQuery.(SimpleJpaQuery.java:70) ~[spring-data-jpa-3.0.0.jar:3.0.0] at org.springframework.data.jpa.repository.query.JpaQueryFactory.fromMethodWithQueryString(JpaQueryFactory.java:55) ~[spring-data-jpa-3.0.0.jar:3.0.0] at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$DeclaredQueryLookupStrategy Caused by: java.lang.IllegalArgumentException: Validation failed for query for method public abstract com.warden.reservationmicroservice.dtos.TimeSlot com.warden.reservationmicroservice.repositories.WorkstationReservationRepository.getFirstNAvailableSlots(int,java.sql.Timestamp,java.sql.Timestamp,int, int) 在 org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:100) ~[spring-data-jpa-3.0.0.jar:3.0.0] 在 org.springframework.data.882920488171 repository.query.SimpleJpaQuery.(SimpleJpaQuery.java:70) ~[spring-data-jpa-3.0.0.jar:3.0.0] at org.springframework.data.jpa.repository.query.JpaQueryFactory.fromMethodWithQueryString584:884Query1384 55) ~[spring-data-jpa-3.0.0.jar:3.0.0] 在 org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$DeclaredQueryLookupStrategy .resolveQuery(JpaQueryLookupStrategy.java:170) ~[spring-data-jpa-3.0.0.jar:3.0.0] at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:252) ~[spring-data-jpa-3.0.0.jar:3.0.0] at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:95) ~[spring-data-jpa-3.0.0.jar:3.0.0] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.lookupQuery(QueryExecutorMethodInterceptor.java:111) ~[spring-data-commons-3.0.0.jar:3.0.0]... 56 common frames omitted Caused by: java.lang.IllegalArgumentException: org.hibernate.query.sqm.ParsingException: line 1:104 mismatched input '(' expecting {, ',', '.', ID, VERSION, VERSIONED, NATURALID, ALL, AND, ANY, AS, ASC, AVG, BETWEEN, BOTH, BY .resolveQuery(JpaQueryLookupStrategy.java:170) ~[spring-data-jpa-3.0.0.jar:3.0.0] at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:252) ~[spring-data-jpa-3.0.0.jar:3.0.0] 在 org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java.resolveQuery)~[spring-3-jpa .0.jar:3.0.0] 在 org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.lookupQuery(QueryExecutorMethodInterceptor.java:111)~[spring-data-commons-3.0.0.jar]...3.6。遗漏了常见的框架 引起:java.lang.IllegalArgumentException:org.hibernate.query.sqm.ParsingException:第 1:104 行不匹配的输入'('期待{,',','。',ID,VERSION,VERSIONED,NATURALID, ALL、AND、ANY、AS、ASC、AVG、BETWEEN、BOTH、BY , CASE, CAST, COLLATE, COUNT, CROSS, CUBE, CURRENT, CURRENT_DATE, CURRENT_INSTANT, CURRENT_TIME, CURRENT_TIMESTAMP, DATE, DATETIME, DAY, DELETE, DESC, DISTINCT, ELEMENT, ELEMENTS, ELSE, EMPTY, END, ENTRY, ERROR, ESCAPE, EVERY, EXCEPT, EXCLUDE, EXISTS, EXTRACT, FETCH, FILTER, FIRST, FOLLOWING, FOR, FORMAT, FROM, FULL, FUNCTION, GROUP, GROUPS, HAVING, HOUR, IGNORE, ILIKE, IN, INDEX, INDICES, INNER, INSERT, INSTANT, INTERSECT, INTO, IS, JOIN, KEY, LAST, LEADING, LEFT, LIKE, LIMIT, LIST, LISTAGG, LOCAL, LOCAL_DATE, LOCAL_DATETIME, LOCAL_TIME, MAP, MAX, MAXELEMENT, MAXINDEX, MEMBER, MICROSECOND, MILLISECOND, MIN, MINELEMENT, MININDEX, MINUTE, MONTH, NANOSECOND, NEW, NEXT, NO, NOT, NULLS, OBJECT, OF, OFFSET, OFFSET_DATETIME, ON, ONLY, OR, ORDER, OTHERS, OUTER, OVER, OVERFLOW, OVERLAY, PAD, PARTITION, PERCENT, PLACING, POSITION, PRECEDING, QUARTER, RANGE, RESPECT, RIGHT, ROLLUP, ROW, ROWS, SECOND, SELECT, SET, SIZE, SOME, SUBSTRING, SUM, THEN, TIES, TI , CASE, CAST, COLLATE, COUNT, CROSS, CUBE, CURRENT, CURRENT_DATE, CURRENT_INSTANT, CURRENT_TIME, CURRENT_TIMESTAMP, DATE, DATETIME, DAY, DELETE, DESC, DISTINCT, ELEMENT, ELEMENTS, ELSE, EMPTY, END, ENTRY, ERROR, 转义, EVERY, EXCEPT, EXCLUDE, EXISTS, EXTRACT, FETCH, FILTER, FIRST, FOLLOWING, FOR, FORMAT, FROM, FULL, FUNCTION, GROUP, GROUPS, HAVING, HOUR, IGNORE, ILIKE, IN, INDEX, INDICES, INNER, INSERT , INSTANT, INTERSECT, INTO, IS, JOIN, KEY, LAST, LEADING, LEFT, LIKE, LIMIT, LIST, LISTAGG, LOCAL, LOCAL_DATE, LOCAL_DATETIME, LOCAL_TIME, MAP, MAX, MAXELEMENT, MAXINDEX, MEMBER, 微秒, 毫秒, 分钟, MINELEMENT, MIINDEX, MINUTE, MONTH, NANOSECOND, NEW, NEXT, NO, NOT, NULLS, OBJECT, OF, OFFSET, OFFSET_DATETIME, ON, ONLY, OR, ORDER, OTHERS, OUTER, OVER, OVERFLOW, OVERLAY, PAD, PARTITION , PERCENT, PLACING, POSITION, PRECEDING, QUARTER, RANGE, RESPECT, RIGHT, ROLLUP, ROW, ROWS, SECOND, SELECT, SET, SIZE, SOME, SUBSTRING, SUM, THEN, TIES, TI ME, TIMESTAMP, TIMEZONE_HOUR, TIMEZONE_MINUTE, TRAILING, TREAT, TRIM, TRUNCATE, TYPE, UNBOUNDED, UNION, UPDATE, VALUE, VALUES, WEEK, WHEN, WHERE, WITH, WITHIN, WITHOUT, YEAR, IDENTIFIER, QUOTED_IDENTIFIER} at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:147) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final] at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:175) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final] at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:182) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final] at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:760) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final] at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:662) ~[hib我,时间戳,TIMEZONE_HOUR,TIMEZONE_MINUTE,TRAILING,TREAT,TRIM,TRUNCATE,TYPE,UNBOUNDED,UNION,UPDATE,VALUE,VALUES,WEEK,WHEN,WHERE,WITHIN,WITHOUT,YEAR,IDENTIFIER,QUOTED_IDENTIFIER} at org.hibernate .internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:147) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final] 在 org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.8894758) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final] 在 org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:182)~[hibernate-core-6.1.6.Final.88202887890 :6.1.6.Final] 在 org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:760) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final] 在 org867898939 .AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:662)~[hib ernate-core-6.1.6.Final.jar:6.1.6.Final] at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:126) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:578) ~[na:na] at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:360) ~[spring-orm-6.0.3.jar:6.0.3] at jdk.proxy2/jdk.proxy2.$Proxy113.createQuery(Unknown Source) ~[na:na] at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:94) ~[spring-data-jpa-3.0.0.jar:3.0.0]... 62 common frames omitted Caused by: org.hibernate.query.sqm.ParsingException ernate-core-6.1.6.Final.jar:6.1.6.Final] 在 org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:126) ~[hibernate-core-6.1.6.Final128.8862: .6.Final] 在 java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na] 在 java.base/java.lang.reflect.Method.invoke828(Method2848289) :578) ~[na:na] at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:360) ~[spring-orm-6.0.3.jar:6.0.3] at jdk.proxy2/jdk.proxy2 .$Proxy113.createQuery(未知来源)~[na:na] 在 org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:94)~[spring-data-jpa-3.0.0.jar: 3.0.0] ... 省略了 62 个常见帧 Caused by: org.hibernate.query.sqm.ParsingException : line 1:104 mismatched input '(' expecting {, ',', '.', ID, VERSION, VERSIONED, NATURALID, ALL, AND, ANY, AS, ASC, AVG, BETWEEN, BOTH, BY, CASE, CAST, COLLATE, COUNT, CROSS, CUBE, CURRENT, CURRENT_DATE, CURRENT_INSTANT, CURRENT_TIME, CURRENT_TIMESTAMP, DATE, DATETIME, DAY, DELETE, DESC, DISTINCT, ELEMENT, ELEMENTS, ELSE, EMPTY, END, ENTRY, ERROR, ESCAPE, EVERY, EXCEPT, EXCLUDE, EXISTS, EXTRACT, FETCH, FILTER, FIRST, FOLLOWING, FOR, FORMAT, FROM, FULL, FUNCTION, GROUP, GROUPS, HAVING, HOUR, IGNORE, ILIKE, IN, INDEX, INDICES, INNER, INSERT, INSTANT, INTERSECT, INTO, IS, JOIN, KEY, LAST, LEADING, LEFT, LIKE, LIMIT, LIST, LISTAGG, LOCAL, LOCAL_DATE, LOCAL_DATETIME, LOCAL_TIME, MAP, MAX, MAXELEMENT, MAXINDEX, MEMBER, MICROSECOND, MILLISECOND, MIN, MINELEMENT, MININDEX, MINUTE, MONTH, NANOSECOND, NEW, NEXT, NO, NOT, NULLS, OBJECT, OF, OFFSET, OFFSET_DATETIME, ON, ONLY, OR, ORDER, OTHERS, OUTER, OVER, OVERFLOW, OVERLAY, PAD, PARTITION, PERCENT, PLACING, POSITION, : 第 1:104 行不匹配的输入 '(' 期待 {, ',', '.', ID, VERSION, VERSIONED, NATURALID, ALL, AND, ANY, AS, ASC, AVG, BETWEEN, BOTH, BY, CASE, CAST , COLLATE, COUNT, CROSS, CUBE, CURRENT, CURRENT_DATE, CURRENT_INSTANT, CURRENT_TIME, CURRENT_TIMESTAMP, DATE, DATETIME, DAY, DELETE, DESC, DISTINCT, ELEMENT, ELEMENTS, ELSE, EMPTY, END, ENTRY, ERROR, ESCAPE, 每个,除了, EXCLUDE, EXISTS, EXTRACT, FETCH, FILTER, FIRST, FOLLOWING, FOR, FORMAT, FROM, FULL, FUNCTION, GROUP, GROUPS, HAVING, HOUR, IGNORE, ILIKE, IN, INDEX, INDICES, INNER, INSERT, INSTANT, INTERSECT , INTO, IS, JOIN, KEY, LAST, LEADING, LEFT, LIKE, LIMIT, LIST, LISTAGG, LOCAL, LOCAL_DATE, LOCAL_DATETIME, LOCAL_TIME, MAP, MAX, MAXELEMENT, MAXINDEX, MEMBER, 微秒, MILLISECOND, MIN, MINEDEMENT, MIINDEX , MINUTE, MONTH, NANOSECOND, NEW, NEXT, NO, NOT, NULLS, OBJECT, OF, OFFSET, OFFSET_DATETIME, ON, ONLY, OR, ORDER, OTHERS, OUTER, OVER, OVERFLOW, OVERLAY, PAD, PARTITION, PERCENT, PLACING , POSITION, PRECEDING, QUARTER, RANGE, RESPECT, RIGHT, ROLLUP, ROW, ROWS, SECOND, SELECT, SET, SIZE, SOME, SUBSTRING, SUM, THEN, TIES, TIME, TIMESTAMP, TIMEZONE_HOUR, TIMEZONE_MINUTE, TRAILING, TREAT, TRIM, TRUNCATE, TYPE, UNBOUNDED, UNION, UPDATE, VALUE, VALUES, WEEK, WHEN, WHERE, WITH, WITHIN, WITHOUT, YEAR, IDENTIFIER, QUOTED_IDENTIFIER} at org.hibernate.query.hql.internal.StandardHqlTranslator$1.syntaxError(StandardHqlTranslator.java:46) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final] at org.antlr.v4.runtime.ProxyErrorListener.syntaxError(ProxyErrorListener.java:41) ~[antlr4-runtime-4.10.1.jar:4.10.1] at org.antlr.v4.runtime.Parser.notifyErrorListeners(Parser.java:543) ~[antlr4-runtime-4.10.1.jar:4.10.1] at org.antlr.v4.runtime.DefaultErrorStrategy.reportInputMismatch(DefaultErrorStrategy.java:327) ~[antlr4-runtime-4.10.1.jar:4.10.1] at org.antlr.v4.runtime.DefaultErrorStrategy.reportError(Defau PRECEDING,QUARTER,RANGE,RESPECT,RIGHT,ROLLUP,ROW,ROWS,SECOND,SELECT,SET,SIZE,SOME,SUBSTRING,SUM,THEN,TIES,TIME,TIMESTAMP,TIMEZONE_HOUR,TIMEZONE_MINUTE,TRAILING,TREAT,TRIM,TRUNCATE,类型,无界,联合,更新,价值,价值,周,何时,何地,有,内,没有,年,标识符,QUOTED_IDENTIFIER} 在 org.hibernate.query.hql.internal.StandardHqlTranslator$1.syntaxError(StandardHqlTranslator.8941838246:8941838246 46) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final] 在 org.antlr.v4.runtime.ProxyErrorListener.syntaxError(ProxyErrorListener.java:41) ~[antlr4-runtime-4.10.1.jar :4.10.1] 在 org.antlr.v4.runtime.Parser.notifyErrorListeners(Parser.java:543) ~[antlr4-runtime-4.10.1.jar:4.10.1] 在 org.antlr.v4.runtime.DefaultErrorStrategy.reportInputMismatch (DefaultErrorStrategy.java:327) ~[antlr4-runtime-4.10.1.jar:4.10.1] 在 org.antlr.v4.runtime.DefaultErrorStrategy.reportError(Defau ltErrorStrategy.java:139) ~[antlr4-runtime-4.10.1.jar:4.10.1] at org.hibernate.grammars.hql.HqlParser.statement(HqlParser.java:343) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final] at org.hibernate.query.hql.internal.StandardHqlTranslator.parseHql(StandardHqlTranslator.java:127) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final] at org.hibernate.query.hql.internal.StandardHqlTranslator.translate(StandardHqlTranslator.java:77) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final] at org.hibernate.internal.AbstractSharedSessionContract.lambda$createQuery$2(AbstractSharedSessionContract.java:747) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final] at org.hibernate.query.internal.QueryInterpretationCacheStandardImpl.createHqlInterpretation(QueryInterpretationCacheStandardImpl.java:141) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final] at org.hibernate.query.inte ltErrorStrategy.java:139) ~[antlr4-runtime-4.10.1.jar:4.10.1] 在 org.hibernate.grammars.hql.HqlParser.statement(HqlParser.882132469458core8[hibernate-882132469458core8:34 .jar:6.1.6.Final] 在 org.hibernate.query.hql.internal.StandardHqlTranslator.parseHql(StandardHqlTranslator.java:127) ~[hibernate-core-6.1.6.Final.8820288:86.9010]在 org.hibernate.query.hql.internal.StandardHqlTranslator.translate(StandardHqlTranslator.java:77) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final] 在 org.8839837.99inter3068 lambda$createQuery$2(AbstractSharedSessionContract.java:747) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final] at org.hibernate.query.internal.QueryInterpretationCacheStandardImpl.createHqlInterpretation(QueryInterpretationCacheStandardImpl.java:141) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final] 在 org.hibernate.query.inte rnal.QueryInterpretationCacheStandardImpl.resolveHqlInterpretation(QueryInterpretationCacheStandardImpl.java:128) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final] at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:744) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]... 69 common frames omitted rnal.QueryInterpretationCacheStandardImpl.resolveHqlInterpretation(QueryInterpretationCacheStandardImpl.java:128) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final] at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:744) ~ [hibernate-core-6.1.6.Final.jar:6.1.6.Final]...省略69个常用框架

Process finished with exit code 1进程结束,退出代码为 1

The @Query isn't the correct SQL for calling stored proc, it doesn't like the new , try: @Query不是调用存储过程的正确 SQL,它不喜欢new的,请尝试:

@Query(value=“CALL getFirstNAvailableSlots(:N,:t_start,:t_end,:cpu,:max_reservable_cpu)”, nativeQuery = true)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM