Hibernate 4从HT_表中删除,其中在子句Token unknown“中&引用;
使用Hibernate 4,以下生成的查询失败:Hibernate 4从HT_表中删除,其中在子句Token unknown“中&引用;,hibernate,firebird,jaybird,Hibernate,Firebird,Jaybird,使用Hibernate 4,以下生成的查询失败: delete from ErpEmploye_AUD where (code, folder_codeId, REV) IN (select code, folder_codeId, REV from HT_ErpEmploye_AUD where hib_sess_id=1) 火鸟例外: SQL error code = -104 Token unknown - line 1, column 39 , 在org.hiberna
delete from ErpEmploye_AUD where (code, folder_codeId, REV)
IN
(select code, folder_codeId, REV from HT_ErpEmploye_AUD where hib_sess_id=1)
火鸟例外:
SQL error code = -104
Token unknown - line 1, column 39
,
在org.hibernate.hql.spi.TableBasedDeleteHandlerImpl类中 所以我想让代码适应Firebird,做同样的工作最近的Firebird语法是什么
我只是迁移到hibernate 4,而且hibernate 4中添加的临时表(前缀为HT…)的每次删除都基于此方法,因此它看起来是一个重要问题。首先,最近的Firebird语法是
delete from ErpEmploye_AUD e where
exists( select code, folder_codeId, REV from HT_ErpEmploye_AUD ht
where ( hib_sess_id=1 and e.code=ht.code and e.folder_codeId=ht.folder_codeId and e.REV=ht.REV ))
第二,右hibernate生成删除代码:
private String generateDelete(String tableName, String[] columnNames, String idSubselect, String comment) {
String[] columnEquals = new String[columnNames.length];
for (int i=0;i<columnNames.length;i++){
columnEquals[i] = "tr."+columnNames[i]+"=ht."+columnNames[i];
}
if (idSubselect.contains("where"))
idSubselect = idSubselect.replace("where", "ht where");
else
idSubselect = idSubselect + " ht where";
final Delete delete = new Delete()
.setTableName( tableName+" tr " )
//.setWhere( "(" + StringHelper.join( ", ", columnNames ) + ") IN (" + idSubselect + ")" );
.setWhere( "exists("+ idSubselect +" "+ StringHelper.join( " and ", columnEquals ) + ")" );
if ( factory().getSettings().isCommentsEnabled() ) {
delete.setComment( comment );
}
return delete.toStatementString();
}
private String generateDelete(String tableName、String[]columnNames、String idSubselect、String comment){
String[]columnEquals=新字符串[columnNames.length];
对于(int i=0;我认为Firebird不支持这种语法。看起来像是Hibernate bug(假设您使用的是Firebird的正确数据库方言),应该向Hibernate报告
private String generateDelete(String tableName, String[] columnNames, String idSubselect, String comment) {
String[] columnEquals = new String[columnNames.length];
for (int i=0;i<columnNames.length;i++){
columnEquals[i] = "tr."+columnNames[i]+"=ht."+columnNames[i];
}
if (idSubselect.contains("where"))
idSubselect = idSubselect.replace("where", "ht where");
else
idSubselect = idSubselect + " ht where";
final Delete delete = new Delete()
.setTableName( tableName+" tr " )
//.setWhere( "(" + StringHelper.join( ", ", columnNames ) + ") IN (" + idSubselect + ")" );
.setWhere( "exists("+ idSubselect +" "+ StringHelper.join( " and ", columnEquals ) + ")" );
if ( factory().getSettings().isCommentsEnabled() ) {
delete.setComment( comment );
}
return delete.toStatementString();
}