我正在使用本机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列中的相同名称。
过去两天我被困在这里,请任何帮助都会很棒。
答案 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错误跟踪的待决问题。
也在hibernate论坛中。这清楚地表明这是一个冬眠结束的错误。
答案 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()
}