我正在从旧系统更新旧库。刚才我试图将Hibernate 3.4.0.GA更新到4.3.11.Final,我只需要改变代码中的小东西,一切都很好。但是当我把系统投入运行时,我正在接收"架构" FOO"执行查询时不存在" 。试图找出问题,我发现这种情况发生在Hibernate 3.5.1到3.5.2以及原因之中。
生成sql时的Hibernate,正在向函数添加模式。我现在展示两个版本的差异。
protocolo_1 是主模式的别名,这是@Formula在Protocolo.java中添加的子查询,模式的名称也是协议。
@Formula
select max (pm2.id) from protocolo.protocolomovimento pm2 where pm2.id_protocolo = id
Hibernate 3.5.1 SQL生成
select max (pm2.id) from protocolo.protocolomovimento pm2 where pm2.id_protocolo = protocolo1_.id
Hibernate 3.5.2 SQL生成
select protocolo_1.max (pm2.id) from protocolo.protocolomovimento pm2 where pm2.id_protocolo = protocolo1_.id
我使用PostgreSQL 9.4.12和各自的驱动程序和org.hibernate.dialect.PostgreSQLDialect(在这个版本的hibernate中,它是PostgreSQL的独特方言)
我在这里找到了另一个有类似问题的人Why is Hibernate adding schema name to Hsql functions?,但我认为它只是类似的,这不是我的情况。
为什么Hibernate这样做?我该如何解决这个问题?
答案 0 :(得分:1)
看起来hibernate不理解表达式max
中(
和max (pm2.id)
之间的空格字符,所以它认为max是列名并在那里添加表别名。
删除空间将解决问题。