【问题标题】:Reference subquery fields in QueryDSL在 QueryDSL 中引用子查询字段
【发布时间】:2014-12-04 01:35:53
【问题描述】:

我必须在 QueryDSL 中构建一个带有子查询的查询,如下所示:

Expression<String> caseExpression = new CaseBuilder()
    ...;

Expression<?>[] queryProjection={
    table.parameter1,
    caseExpression
};


Expression<?>[] subqueryProjection={
    table.parameter1.as("alias1"),
    table.parameter2.as("alias2"),
    table.parameter3.as("alias3"),
    table.parameter4.as("alias4")
};


SQLSubQuery subQuery = new SQLSubQuery()
      .from(table)
      .where(...);

JPASQLQuery query = new JPASQLQuery(entityManager, ORACLE_TEMPLATE)
    .from(subQuery.list(subqueryProjection));

query.list(queryProjection);

我收到以下异常:

9/10/2014 09:45:55 AM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() para servlet rtve-rest lanzó excepción
java.sql.SQLException: ORA-00904: "TABLE"."PARAMETER1": invalid identifier

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:219)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:813)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1049)
at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:854)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1154)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3370)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3415)
at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93)
at sun.reflect.GeneratedMethodAccessor54.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
at $Proxy78.executeQuery(Unknown Source)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1953)
at org.hibernate.loader.Loader.doQuery(Loader.java:829)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289)
at org.hibernate.loader.Loader.doList(Loader.java:2438)
at org.hibernate.loader.Loader.doList(Loader.java:2424)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2254)
at org.hibernate.loader.Loader.list(Loader.java:2249)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:331)
at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1784)
at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:229)
at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:156)
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:257)
at com.mysema.query.jpa.sql.AbstractJPASQLQuery.list(AbstractJPASQLQuery.java:145)

这是因为我的 queryProjection 中的字段与我的 subqueryProjection 中的字段不同。该字段必须与子查询中的相同(“alias1”)。

如何通过别名引用字段?或者我如何从外部引用子查询中的字段?

非常感谢您

【问题讨论】:

    标签: sql jpa subquery alias querydsl


    【解决方案1】:

    您需要使用以 alias1 作为名称的 Path 实例,或者去掉别名。创建该路径的最简单方法是

    Expressions.path(Object.class, "alias1")
    

    如果需要,将 Object 替换为更具体的类型。

    【讨论】:

    • 感谢您的回答。我终于按照我在my answer 中展示的方式做到了。
    【解决方案2】:

    我设法用Expressions.stringTemplate做到了:

    Expression<?>[] queryProjection={
        Expressions.stringTemplate("alias1"),
        caseExpression
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-09
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多