使用多个连接查询相同表格的 Hibernate 原生查询返回错误结果

8
我正在使用一条本地 SQL 查询,其中我加入了三次球员表,第一次是为了获取击球手的姓名,然后是获取投球手的名称和获取守垒手的名字。现在第一个连接可以工作,但接下来的两个连接也返回相同的名称,即击球手的名称。
以下是 SQL 查询:
 select 
    del.over_no , 
    del.delivery_no , 
    batsman.sname , 
    outType.name , 
    outBy.sname , 
    fielder.sname , 
    bep.runs, 
    bep.deliveries, 
    bep.fours, 
    bep.sixes

    from delivery del 
    INNER JOIN batsman_performance bep ON del.innings_id=bep.innings_id 
    INNER JOIN ref_player batsman ON del.batsman_id = batsman.id
    INNER JOIN ref_player outBy ON del.bowler_id = outBy.id
    LEFT OUTER JOIN ref_player fielder ON del.fielder_id1= fielder.id
    INNER JOIN ref_out_type outType ON del.out_type_id=outType.id
    and del.out_type_id IS NOT NULL 
    and del.innings_id=:innings_id 
    and bep.player_id = del.batsman_id
    order by over_no, delivery_no;

我没有为选定的列使用别名,因为当我这样做时,无论我使用哪个列的别名,Hibernate都会抛出异常。

请求处理失败;嵌套异常是javax.persistence.PersistenceException:org.hibernate.exception.SQLGrammarException:无法执行查询],根本原因是java.sql.SQLException:找不到列'over_no'。

当我在MySQL客户端上运行此查询并返回正确的数据集时,但当我在我的代码中运行它时,结果集会以某种方式覆盖ref_player表上的两个后续连接,使我在所有三个列(即batsman.sname、outBy.sname和fielder.sname列)中都得到击球手名称相同的结果。

我已经卡在这里两天了,请任何帮助都将是巨大的帮助。


你如何准确执行查询? - axtavt
查询 query = em.createNativeQuery(sqlQuery); ((QueryImpl)query).getHibernateQuery().setResultTransformer(Transformers.TO_LIST); 然后在设置参数之后,List<List<Object>> result =query.getResultList(); - Khizar
@axtavt ...... 什么都没有 .... ??? - Khizar
好的,没问题,谢谢你关注它 :) - Khizar
你尝试过启用Hibernate SQL日志记录来查看它在幕后将你的代码转换成什么吗?如果没有,请在<properties>标签内添加以下内容到你的persistence.xml文件中:<property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/>。 - skel625
是的,我做了那个...而是追踪了在mysql服务器上运行的查询。它得到了正确的结果,所以Hibernate出了问题。但我仍会再次检查它们,看看是否能找到错误。 - Khizar
4个回答

5
尝试在另一个select语句中包装您的select语句,这样应该可以正常工作。我正在使用存储过程,但这不应该有任何影响。
SELECT * FROM (

SELECT 
    del.over_no , 
    del.delivery_no , 
    batsman.sname , 
    outType.name , 
    outBy.sname , 
    fielder.sname , 
    bep.runs, 
    bep.deliveries, 
    bep.fours, 
    bep.sixes

    from delivery del 
    INNER JOIN batsman_performance bep ON del.innings_id=bep.innings_id 
    INNER JOIN ref_player batsman ON del.batsman_id = batsman.id
    INNER JOIN ref_player outBy ON del.bowler_id = outBy.id
    LEFT OUTER JOIN ref_player fielder ON del.fielder_id1= fielder.id
    INNER JOIN ref_out_type outType ON del.out_type_id=outType.id
    and del.out_type_id IS NOT NULL 
    and del.innings_id=:innings_id 
    and bep.player_id = del.batsman_id
    order by over_no, delivery_no
) AS subselection;

在上面的代码中,你实际上应该使用别名,否则将会有两个同名的列,这将导致错误。

非常感谢你的回复,我会测试并发布结果 :) - Khizar

2

0
发现了相同的问题。 另一个解决方法是使用org.hibernate.Session#doWork并在JDBC连接上执行查询:
entityManager.unwrap(Session.class).doWork(new Work() {
  void execute(Connection c) throws SQLException {
   PreparedStatement stmt = c.prepareStatement("SELECT ... JOIN ... JOIN ...");
   try {
     ...
   } finally {
     stmt.close() 
   }

0

你试过更改吗?

 order by over_no, delivery_no; 

 order by del.over_no, del.delivery_no;

谢谢您的告知。正如您所见,我没有太多的声望 :) - Mihriban Minaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接