如何像在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 + " ) ";
}
]]>
答案 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();