spring-mvc - 运行 JPA 查询的 SQL 语句中的语法错误
问题描述
我在 Spring MvC 项目中有这个 JPA 查询
@Query(value = "with\n"
+ " jupiter_courante ( \n"
+ " jupiter_id\n"
+ ")"
+ "as (\n"
+ " select pa.jupiter_id from\n"
+ "jupiter_microfusa pa\n"
+ "inner join jupiter_composition pc on pa.JUPITER_ID = pc.JUPITER_ID\n"
+ "inner join jupiter_composition_type pct on pc.TYPEJUPITERCOMPOSITION_ID = pct.TYPEJUPITERCOMPOSITION_ID\n"
+ "inner join donnees_contact dc on pc.microfusa_id = dc.microfusa_Id\n"
+ "inner join donnees_contact_type dct on dc.TYPE_DONNEE_CONTACT_ID = dct.TYPE_DONNEE_CONTACT_ID\n"
+ "where pct.code = 'kimi'\n"
+ "),\n"
+ "aquarius_du_menage_courant as (\n"
+ "select microfusa_id from jupiter_composition ac\n"
+ "inner join jupiter_composition_type act on ac.TYPEJUPITERCOMPOSITION_ID = act.TYPEJUPITERCOMPOSITION_ID\n"
+ "where jupiter_id = (select jupiter_id from jupiter_courante)\n"
+ "),\n"
+ "parents_du_menage_courant as (\n"
+ "select microfusa_id from jupiter_composition ac\n"
+ "inner join jupiter_composition_type act on ac.TYPEJUPITERCOMPOSITION_ID = act.TYPEJUPITERCOMPOSITION_ID\n"
+ "where jupiter_id = (select jupiter_id from jupiter_courante)\n"
+ "and act.code in ('oko', 'aqa')\n"
+ "),\n"
+ "toutes_autorisations as\n"
+ "(\n"
+ "select aut.dt_debut, aut.dt_Fin, aut.AQUARIUS_ID, aut.autorisation_id, aut_p.*, decode(aut_ty.desc_long, 'interdiction', 1, 0) as interdiction from autorisation aut\n"
+ "inner join autorisation_microfusa aut_p on aut.AUTORISATION_PERSONNE_ID = aut_p.AUTORISATION_PERSONNE_ID\n"
+ "inner join autorisation_type aut_ty on aut.autorisation_type_id = aut_ty.autorisation_type_id\n"
+ "),\n"
+ "phone as (\n"
+ "select microfusa_id, contenu as telephone from (\n"
+ "select dc.microfusa_id, dc.contenu, row_number() over (partition by microfusa_id order by (case when code = 'W' then 1 when code = 'ER' then 2 when code = 'FG' then 3 when code = 'TES' then 4 else 10 end) ) rown from donnees_contact dc\n"
+ "inner join donnees_contact_type dct on dc.TYPE_DONNEE_CONTACT_ID = dct.TYPE_DONNEE_CONTACT_ID\n"
+ "where microfusa_id in (select microfusa_id from parents_du_menage_courant)\n"
+ "and dct.code in ('AW', 'GSSM','TMNB', 'TPOL')\n"
+ ") where rown = 1\n"
+ "),\n"
+ "email as (\n"
+ "select microfusa_id, contenu as email from (\n"
+ "select dc.microfusa_id, dc.CONTENU, dct.CODE, row_number() over (partition by microfusa_id order by (case when code = 'EMAIL' then 1 when code = 'EMAIL PRIVE' then 2 else 10 end) ) rown from donnees_contact dc\n"
+ "inner join donnees_contact_type dct on dc.TYPE_DONNEE_CONTACT_ID = dct.TYPE_DONNEE_CONTACT_ID\n"
+ "where microfusa_id in (select microfusa_id from parents_du_menage_courant)\n"
+ "and dct.code in ('EMAIL', 'EMAIL2')\n"
+ ") where rown = 1\n"
+ ")\n"
+ " \n"
+ "select * from\n"
+ "(\n"
+ "select distinct p.microfusa_Id as aquarius_id, p.nom as aquarius_nom, p.prenom as aquarius_prenom , tas.nom as authorised_nom\n"
+ ", tas.prenom as authorised_prenom , tas.interdiction as IPerAut_interdiction, tas.telephone, tas.email, tas.AUTORISATION_PERSONNE_ID as microfusaautoriseeID, 1 as modifiable\n"
+ ", tas.interdiction as IPerAutEx_interdiction, tas.dt_debut, tas.dt_Fin, tas.autorisation_id as autorisationID\n"
+ "from aquarius_du_menage_courant emc\n"
+ "inner join microfusa p on emc.microfusa_id = p.microfusa_id\n"
+ "inner join toutes_autorisations tas on p.microfusa_Id = tas.aquarius_id\n"
+ " \n"
+ "union\n"
+ " \n"
+ "select distinct p.microfusa_Id as aquarius_id, p.nom as aquarius_nom, p.prenom as aquarius_prenom , par.nom as authorised_nom\n"
+ ", par.prenom as authorised_prenom , 0 as IPerAut_interdiction, par.telephone, par.email, null as microfusaautoriseeID, 0 as modifiable\n"
+ ", 0 as IPerAutEx_interdiction, null as dt_debut, null as dt_Fin, null as autorisationID\n"
+ "from aquarius_du_menage_courant emc\n"
+ "inner join microfusa p on emc.microfusa_id = p.microfusa_id\n"
+ "inner join (\n"
+ "select p.NOM, p.PRENOM, ph.telephone, e.* from microfusa from microfusa p\n"
+ "left outer join phone ph on p.microfusa_id = ph.microfusa_id\n"
+ "left outer join email e on p.microfusa_id = e.microfusa_id\n"
+ "where p.microfusa_id in (select * from parents_du_menage_courant)\n"
+ ") par on 1 = 1\n"
+ ")\n"
+ "order by aquarius_id;")
但是当我在测试中运行查询时出现此错误,但没有消息:
EL Warning]: 2020-10-17 20:16:38.297--UnitOfWork(522173599)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.7.v20200504-69f2c2b80d): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "with....
at org.h2.message.DbException.getJdbcSQLException(DbException.java:453)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:429)
at org.h2.message.DbException.getSyntaxError(DbException.java:243)
at org.h2.command.Parser.getSyntaxError(Parser.java:1053)
at org.h2.command.Parser.read(Parser.java:4995)
at org.h2.command.Parser.readTableFilter(Parser.java:1893)
at org.h2.command.Parser.readJoin(Parser.java:2412)
at org.h2.command.Parser.parseJoinTableFilter(Parser.java:2839)
at org.h2.command.Parser.parseSelectFromPart(Parser.java:2828)
at org.h2.command.Parser.parseSelect(Parser.java:2959)
at org.h2.command.Parser.parseQuerySub(Parser.java:2817)
at org.h2.command.Parser.parseSelectUnion(Parser.java:2666)
at org.h2.command.Parser.readTableFilter(Parser.java:1892)
at org.h2.command.Parser.parseSelectFromPart(Parser.java:2827)
at org.h2.command.Parser.parseSelect(Parser.java:2959)
at org.h2.command.Parser.parseQuerySub(Parser.java:2817)
at org.h2.command.Parser.parseSelectUnion(Parser.java:2649)
at org.h2.command.Parser.parseWithQuery(Parser.java:6800)
at org.h2.command.Parser.parseWith1(Parser.java:6752)
at org.h2.command.Parser.parseWith(Parser.java:6722)
at org.h2.command.Parser.parseWithStatementOrQuery(Parser.java:2633)
at org.h2.command.Parser.parsePrepared(Parser.java:872)
at org.h2.command.Parser.parse(Parser.java:843)
at org.h2.command.Parser.parse(Parser.java:819)
at org.h2.command.Parser.prepareCommand(Parser.java:738)
at org.h2.engine.Session.prepareLocal(Session.java:657)
at org.h2.engine.Session.prepareCommand(Session.java:595)
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1235)
at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:76)
at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:352)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.prepareStatement(DatabaseAccessor.java:1595)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.prepareStatement(DatabaseAccessor.java:1544)
at org.eclipse.persistence.internal.databaseaccess.DatabaseCall.prepareStatement(DatabaseCall.java:806)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:628)
... 85 more
解决方案
你有一个错字
+ "and dct.code in ('EMAIL', 'EMAIL2)\n"
它应该是
+ "and dct.code in ('EMAIL', 'EMAIL2')\n"
可能还有其他问题,但您需要发布完整的错误消息,在您的问题中它被截断并且几乎没有用。例如,您可以尝试直接使用 JDBC 来执行这个查询(有固定的错字)。
在编辑后的问题中,您还有另一个错误。from microfusa from microfusa p
应该是from microfusa p
。
推荐阅读
- postgresql - 在应用程序代码上使用 Postgres 的外部过程语言
- android - 房间没有检测到@Typeconverters
- c++ - 如何在 C++ 中交换父指针和子指针?
- python - 使用 Python Selenium 在新浏览器中保持登录(保存会话)
- matlab - 为 RGB 图像组合颜色通道未按预期工作
- sql - Impala 中随时间变化的 AVG 窗口 ... OVER (PARTITION BY ... ORDER BY)
- javascript - 在 TypeScript 中使用 createSelector 创建选择器工厂
- swift - 寻求帮助。view.backgroundColor
- javascript - 无法更新不可变列表项值
- node.js - 通过创建 server.js 在 Heroku 上部署 Angular 的问题