带有order by的jpql复杂查询



我有两个实体(这只是一个简化的例子,而不是真正的实体):

@Entity
@Table(name = "entityA")
public class EntityA {
@ManyToOne(cascade = CascadeType.ALL)
EntityB start;
@ManyToOne(cascade = CascadeType.ALL)
EntityB stop;
...
}

@Entity
@Table(name = "entityB")
public class EntityB {
public String name; 
...
}

当我试图用订单编写查询时,Hibernate崩溃:

select t.start from EntityA t
where 
...
order by t.start.name

它不允许我放t.start.name,如果我用t.start代替它,它会很好地工作。有人知道它为什么会这样做吗?

编辑:这是hibernate翻译的查询:

SELECT DISTINCT entityB1_.uuid AS uuid2021_, ..
entityB1_.name               AS name2021_,
...
FROM entityA entityA0_
INNER JOIN entityB entityB1_
ON entityA0_.stop_uuid=entityB1_.uuid,
entityB entityB2_,
entityB entityB3_
WHERE entityA0_.start_uuid    =entityB2_.uuid
AND entityA0_.start_uuid=entityB3_.uuid
AND entityA0_.qn        =?
AND entityB2_.lifeCycle            ='READY'
AND entityB3_.lifeCycle            ='READY'
ORDER BY entityB2_.name

正如您在顺序中看到的那样,它将"entityB2"而不是"entityB1",后者是所选字段。通过这种方式,它给了我一个例外:

由以下原因引起:java.sql.SQLSyntaxErrorException:ORA-0791:不是SELECTed表达式

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)

~[ojdbc7.jar:12.1.0.1.0]位于oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399)~[ojdbc7.jar:12.1.0.1.0]在oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1017)~[ojdbc7.jar:12.1.0.1.0]在oracle.jdbc.driver.T4CTTIfun.rereceive(T4CTTIfun.java:655)~[ojdbc7.jar:12.1.0.1.0]在oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:249)~[ojdbc7.jar:12.1.0.1.0]位于oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:566)~[ojdbc7.jar:12.1.0.1.0]位于oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreperedStatement.java:215)~[ojdbc7.jar:12.1.0.1.0]位于oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:58)~[ojdbc7.jar:12.1.0.1.0]位于oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreperedStatement.java:776)~[ojdbc7.jar:12.1.0.1.0]在oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:897)~[ojdbc7.jar:12.1.0.1.0]位于oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1034)~[ojdbc7.jar:12.1.0.1.0]位于oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedSStatement.java:3820)~[ojdbc7.jar:12.1.0.1.0]位于oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedSStatement.java:3867)~[ojdbc7.jar:12.1.0.1.0]位于oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedSStatementWrappeR.java:1502)~[ojdbc7.jar:12.1.0.1.0]位于weblogic.jdbc.wapper.PreparedStatement.executeQuery(PreparedSStatement.java:141)~[weblogic.server.merged.jar:12.1.3.0.0]位于org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatch.java:208)~[hibernate-core-3.5.6-最终。jar:3.5.6-最终]在org.hibernate。loader.loader.getResultSet(loader.java:1869)~[hibernate-core-3.5.6-Final.jar:3.5.6-Final]在org.hibernate.loader.loader.doQuery(loader.java:718)~[hibernate-core-3.5.6-Final.jar:3.5.6-Final]位于org.hibernate.loader.loader.doQueryAndInitializeNonLazyCollection(loader.java:270)~[hibernate-core-3.5.6-最终。jar:3.5.6-最终]在org.hibernate.loader.loader.doList(loader.java:2449)~[hibernate-core-3.5.6-Final.jar:3.5.6-Final]

尝试这样的操作,看看这是否会阻止Hibernate添加不必要的连接

SELECT s FROM EntityA t JOIN t.start s ORDER BY s.name

最新更新