0

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

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

是否可以像这样为 EclispeLink 自定义,非常感谢您的帮助。

询问

select customernumber from orders

用于查询的自定义 Where 子句

<![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 + " ) ";
}


  ]]> 
4

1 回答 1

0

从文档:

以 Java Persistence 查询语言指定一个静态的命名查询。查询名称的范围是持久性单元。NamedQuery 注解可以应用于实体或映射的超类

因此,NamedQuery不能在运行时更改。同样随着参数数量的变化,查询也会发生变化。NamedQuery因此,在这种特殊情况下使用是不可行的。

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

entityManager.createQuery(queryText).getResultList();

此外,您可以直接使用关键字IN并将列表设置为参数以消除迭代。

//-- Ignoring code for appending parameters & conditions
String whereCondition = " where customernumber IN (:customerNumbers)";
queryText = queryText + whereCondition;
entityManager.createQuery(queryText).setParameter("customerNumbers", customerNumbersList).getResultList();
于 2012-11-26T09:40:00.733 回答