【问题标题】:convert from SQL to JPA query从 SQL 转换为 JPA 查询
【发布时间】:2021-06-27 03:39:23
【问题描述】:

我有这个 SQL 查询

SELECT 'variable'                CATEGORY,
       'Referral Received in '    VARIABLE,
       SUM (OPD)                 OPD,
       SUM (IPD)                 IPD,
       SUM (DC)                  DAYCARE,
       SUM (PROC)                PROCEDURE,
       SUM (SUR)                 SURGERY,
         SUM (NVL (OPD, 0))
       + SUM (NVL (IPD, 0))
       + SUM (NVL (DC, 0))
       + SUM (NVL (PROC, 0))
       + SUM (NVL (SUR, 0))      AS TOTAL
  FROM (SELECT CASE WHEN B.ID = 1 THEN 1 END     AS OPD,
               CASE WHEN B.ID = 2 THEN 1 END     AS IPD,
               CASE WHEN B.ID = 3 THEN 1 END     AS DC,
               CASE WHEN B.ID = 4 THEN 1 END     AS PROC,
               CASE WHEN B.ID = 5 THEN 1 END     AS SUR
          FROM REF_TB_APP_TRANSACTIONS A, REF_VW_VISIT_TYPE B
         WHERE REQ_VISIT_TYPE = B.ID AND A.TO_EST_CODE = 20068)

我想将其转换为 JPA 查询 我试过了,但它给了我很多错误(这是我第一次写 JPA 查询)

SELECT 'variable'                CATEGORY," + 
            "                 'Referral Received in '    VARIABLE," + 
            "                 SUM (OPD)                 OPD," + 
            "                 SUM (IPD)                 IPD," + 
            "                 SUM (DC)                  DAYCARE," + 
            "                 SUM (PROC)                PROCEDURE," + 
            "                 SUM (SUR)                 SURGERY," + 
            "                    SUM (NVL (OPD, 0))" + 
            "                 + SUM (NVL (IPD, 0))" + 
            "                  + SUM (NVL (DC, 0))" + 
            "                  + SUM (NVL (PROC, 0))" + 
            "                  + SUM (NVL (SUR, 0))      AS TOTAL" + 
            "             FROM (SELECT CASE WHEN B.id = 1 THEN 1 END     AS OPD," + 
            "                          CASE WHEN B.id = 2 THEN 1 END     AS IPD," + 
            "                          CASE WHEN B.id = 3 THEN 1 END     AS DC," + 
            "                         CASE WHEN B.id = 4 THEN 1 END     AS PROC," + 
            "                          CASE WHEN B.id = 5 THEN 1 END     AS SUR" + 
            "                    FROM model.central.RefTbAppTransaction A, model.central.RefVwVisitType B" + 
            "                   WHERE A.reqVisitType.id = B.id AND A.toEstCode = :toEstCode)

这两个实体 RefTbAppTransactionRefVwVisitType

如果有任何帮助,这是一个错误

[ERROR] 2021-03-31 11:02:07 [] ErrorTracker - line 1:1016: unexpected token: CASE
[ERROR] 2021-03-31 11:02:07 [] ErrorTracker - line 1:1016: unexpected token: CASE
antlr.NoViableAltException: unexpected token: CASE
    at org.hibernate.hql.internal.antlr.HqlBaseParser.fromRange(HqlBaseParser.java:1519) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
    at org.hibernate.hql.internal.antlr.HqlBaseParser.fromClause(HqlBaseParser.java:1363) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
    at org.hibernate.hql.internal.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1063) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
    at org.hibernate.hql.internal.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:748) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
    at org.hibernate.hql.internal.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:319) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
    

这是另一个

[ERROR] 2021-03-31 11:02:07 [] ErrorTracker - line 1:1284: expecting EOF, found ')'
[ERROR] 2021-03-31 11:02:07 [] ErrorTracker - line 1:1284: expecting EOF, found ')'
antlr.MismatchedTokenException: expecting EOF, found ')'
    at antlr.Parser.match(Parser.java:211) ~[antlr-2.7.7.jar:?]
    at org.hibernate.hql.internal.antlr.HqlBaseParser.statement(HqlBaseParser.java:215) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:290) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:189) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:144) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:113) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:73) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:155) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:600) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:709) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]

我认为是语法错误或某些关键字未在 JPA 中定义

【问题讨论】:

  • 请将您的堆栈跟踪作为文本而不是屏幕截图发布。

标签: java sql spring-boot spring-mvc jpa


【解决方案1】:

从您的堆栈跟踪来看,您的查询似乎被解释为 hql(请参阅HqlBaseParser)。如果你想写sql而不是hql,你需要使用createNativeQuery而不是createQuery

有关如何使用createNativeQuery 的一些示例,请参阅https://vladmihalcea.com/the-jpa-entitymanager-createnativequery-is-a-magic-wand/

【讨论】:

  • 如何将我的 SQL 转换为 JPA 我不想要 hql
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-16
  • 2018-03-13
  • 2018-06-28
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多