Hibernate本机查询在同一个表上有多个连接返回错误的结果

时间:2012-08-13 07:11:30

标签: mysql hibernate join nativequery

我正在使用本机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名称三列,即batsman.sname,outBy.sname和fielder.sname列中的相同名称。

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

4 个答案:

答案 0 :(得分:4)

尝试将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;

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

答案 1 :(得分:2)

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

See this ticket

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

See Hibernate Forum Discussion

答案 2 :(得分:0)

你尝试过改变

吗?
 order by over_no, delivery_no; 

 order by del.over_no, del.delivery_no;

答案 3 :(得分: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() 
   }