Hibernate 4从HT_tables中删除where IN子句令牌未知"," [英] Hibernate 4 Delete from HT_tables where IN clause Token unknown ","

查看:149
本文介绍了Hibernate 4从HT_tables中删除where IN子句令牌未知","的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用Hibernate 4,下面生成的查询失败:

 从ErpEmploye_AUD中删除其中(code,folder_codeId,REV)

(select code,folder_codeId,REV from HT_ErpEmploye_AUD where hib_sess_id = 1)

Firebird异常:

pre $ $ code $ SQL $错误代码-104
令牌未知 - 第1行第39列






在org.hibernate.hql.spi中。 TableBasedDeleteHandlerImpl类有
https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/hql/spi/TableBasedDeleteHandlerImpl.java

  private String generateDelete(String tableName,String [] columnNames,
String idSubselect,String comment){
删除()
.setTableName(tableName)
.setWhere((+ StringHelper.join(,,columnNames)+
)IN(+ idSubselect +));
return delete.toStatementString();

$ / code>

所以我想让代码适应Firebird,最近的Firebird语法是什么做同样的工作?

我只是迁移到了hibernate 4,并且它希望每次从hibernate 4中添加的临时表中删除(以HT_ ...为前缀)都基于此方法它看起来是一个重要的问题。

解决方案

第一个最近的Firebird语法是

 从ErpEmploye_AUD删除其中
存在(从HT_ErpEmploye_AUD选择代码,folder_codeId,REV ht
其中(hib_sess_id = 1和e.code = ht.code和e.folder_codeId = ht.folder_codeId和e.REV = ht.REV))

第二个正确的休眠generateDelete代码:

pre $ private $ String createDelete(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 = new Delete()
.setTableName(tableName +tr)
//。setWhere((+ StringHelper.join(,,columnNames)+) IN(+ idSubselect +));
.setWhere(exists(+ idSubselect ++ StringHelper.join(and,columnEquals)+)); ()()。getSettings()。isCommentsEnabled()){
delete.setComment(comment);

if
}
return delete.toStatementString();
}

我希望这应该在hibernate中得到推广,因为这不是一个标准代码,或者可以被Firebird支持

Using Hibernate 4, the below generated query failed :

delete from ErpEmploye_AUD where (code, folder_codeId, REV) 
    IN 
(select code, folder_codeId, REV from HT_ErpEmploye_AUD where hib_sess_id=1)

Firebird Exception :

SQL error code = -104
Token unknown - line 1, column 39
,


In the org.hibernate.hql.spi.TableBasedDeleteHandlerImpl Class there is https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/hql/spi/TableBasedDeleteHandlerImpl.java

    private String generateDelete(String tableName, String[] columnNames, 
                    String idSubselect, String comment) {
        final Delete delete = new Delete()
            .setTableName( tableName )
            .setWhere( "(" + StringHelper.join( ", ", columnNames ) +
 ") IN (" + idSubselect + ")" );          
        return delete.toStatementString();
    }

So i want to adapt the code to Firebird, what is the nearest Firebird syntaxe to do same job?

i just migrate to hibernate 4, and it apeare that every delete from the temporary tables added in hibernate 4 (prefixed with HT_ ...) is based on this method so it looks as an important issue.

解决方案

First the nearest Firebird syntaxe is

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 ))

Second the right hibernate generateDelete code :

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();
}

I hope that this should be generalised in hibernate, because this is not a standard code, or could be supported by Firebird

这篇关于Hibernate 4从HT_tables中删除where IN子句令牌未知&quot;,&quot;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆