我有两个实体(这只是一个简化的例子,而不是真正的实体):
@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