【问题标题】:Hibernate native query with multiple joins on same table returning wrong resultsHibernate 本机查询在同一个表上具有多个联接返回错误结果
【发布时间】:2012-08-09 09:45:41
【问题描述】:

我正在使用本机 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: could not execute query] 根本原因 java.sql.SQLException:未找到列“over_no”。

当我在我的 mysql 客户端上运行它并返回正确的数据集时,这个查询正在工作,但是当我在我的代码中运行它时,结果集以某种方式覆盖了 ref_player 表上的两个后续连接,给我留下了击球手的名字三列,即 batsman.sname、outBy.sname 和 fielder.sname 列中的同名。

最近两天我被困在这里,请任何帮助都会很棒。

【问题讨论】:

  • 你是如何执行查询的?
  • Query query = em.createNativeQuery(sqlQuery); ((QueryImpl)query).getHibernateQuery().setResultTransformer(Transformers.TO_LIST); 然后设置好参数后,List<List<Object>> result =query.getResultList();
  • @axtavt ......什么都没有...... ???
  • 好的,感谢您的调查:)
  • 您是否尝试过启用休眠 sql 日志记录以查看它在幕后将您的代码转换成什么?如果没有,请将以下内容添加到 标签内的 persistence.xml:

标签: mysql hibernate join nativequery


【解决方案1】:

尝试将您的选择包装在另一个选择语句中,它应该可以工作。 我正在使用存储过程,但它不应该有任何区别

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;

在上面你实际上应该使用别名,否则你将有两个同名的列,这将引发错误

【讨论】:

  • 感谢很多人的回复,我会测试它并发布结果:)
【解决方案2】:

它是 Hibernate 错误跟踪的未决问题。

See this ticket

也在休眠论坛中。这清楚地表明这是一个休眠结束的错误。

See Hibernate Forum Discussion

【讨论】:

    【解决方案3】:

    你有没有尝试改变

     order by over_no, delivery_no; 
    

     order by del.over_no, del.delivery_no;
    

    【讨论】:

    • 感谢您的告知。如你所见,我没有太多名声:)
    【解决方案4】:

    发现了同样的问题。 另一种解决方法是使用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() 
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-23
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多