Eclipselink或Hibernate中的NamedQuery Customization

时间:2012-11-26 09:24:32

标签: java sql hibernate eclipselink birt

如何像在BirtReport中一样自定义EclipseLink中的NamedQuery。

下面是Birt报告的查询和自定义Where子句

对于EclispeLink,这可以像这样自定义,非常感谢您的帮助。

查询

select customernumber from orders

自定义查询条款

<![CDATA[ 
var parmcount = params["parmorders"].value.length
var whereclause = "";
if( parmcount > 0 ){
    whereclause = " where customernumber in ( ";
}
for( i=0; i < parmcount; i++ ){
    if( i == 0 ){
        whereclause = whereclause + params["parmorders"].value[i];
    }else{
        whereclause = whereclause + " , " + params["parmorders"].value[i];  
    }
}
if( parmcount > 0 ){
    this.queryText = this.queryText + whereclause + " ) ";
}


  ]]> 

1 个答案:

答案 0 :(得分:0)

来自文档:

  

在Java Persistence查询中指定静态的命名查询   语言。查询名称的范围限定为持久性单元。该   NamedQuery注释可以应用于实体或映射的超类

因此,NamedQuery无法在运行时更改。此外,随着参数更改次数的不同,查询也会发生变化。因此,对于这种特殊情况使用NamedQuery是不可行的。

但您可以尝试创建查询&amp;在运行时根据参数动态附加条件,就像在代码中发布一样。

entityManager.createQuery(queryText).getResultList();

此外,您可以直接使用关键字IN&amp;将List设置为参数以消除迭代。

//-- Ignoring code for appending parameters & conditions
String whereCondition = " where customernumber IN (:customerNumbers)";
queryText = queryText + whereCondition;
entityManager.createQuery(queryText).setParameter("customerNumbers", customerNumbersList).getResultList();