JAVA EclipseLink可选查询参数

JAVA EclipseLink可选查询参数,java,database,jpa,orm,persistence,Java,Database,Jpa,Orm,Persistence,我有一个按特定条件筛选项目的查询: @NamedQueries({ @NamedQuery( name = ITEM.FIND_ALL_PARAMS_BY_COMPANY_COUNTRY_GROUP, query = "SELECT i FROM Item i where " + "((i.idCompany=:companyId AND i.idEMGroup=:gr

我有一个按特定条件筛选项目的查询:

@NamedQueries({
        @NamedQuery(
                name = ITEM.FIND_ALL_PARAMS_BY_COMPANY_COUNTRY_GROUP,
                query = "SELECT i FROM Item i where "
                        + "((i.idCompany=:companyId AND i.idEMGroup=:groupId) "
                        + "OR (i.idCompany=:companyId AND i.idEMCountry =:countryId AND i.idEMGroup is null) "
                        + "OR (i.idCompany is null AND i.idEMCountry = :countryId AND i.idEMGroup is null)) "
                        + "order by i.idEMCountry desc, i.idCompany desc, i.idEMGroup desc")
})

在某些情况下,参数idEMGroupocompanyId可以为null,这会生成sql如下所示
IdEmCompany=200630758)和(idEMGroup=null)
这是不正确的sql语法是否可以动态地将if值设为null,因为
'Column is null'
而不是
'Column=null'
,而无需添加大量if,或者最好使用Criteria API重写此查询,然后检查值是否存在,并在某些条件下添加谓词?

正确的答案是使用
CriteriaQuery

虽然也可以动态构造查询,但是操作
@NamedQuery
是不可能的,或者可能需要一些不值得做的东西

相反,您可以先将查询构造为
字符串
,然后通过操作查询字符串创建
TypedQuery

String strQuery = "SELECT i FROM Item i"; // .. + the rest of stuff
if(null==companyId) {
   // add something  like "companyId IS :companyId"
   // ":companyId" coulöd also be NULL"
   // but to enable using tq.setParameter("companyId", companyId)
   // without checking if there is param "companyId" so there always will
} else {
   // add something like "companyId=:companyId"
}
TypedQuery<Item> tq = entityManager.createQuery(strQuery, Item.class);
tq.setParameter("companyId", companyId);
String strQuery=“从项目i中选择i”/…+其余的东西
if(null==companyId){
//添加类似“companyId为:companyId”的内容
//“:companyId”也可以为NULL”
//但要启用使用tq.setParameter(“companyId”,companyId)
//不检查是否有param“companyId”,所以总是会有
}否则{
//添加类似“companyId=:companyId”的内容
}
TypedQuery tq=entityManager.createQuery(strQuery,Item.class);
设置参数(“companyId”,companyId);
将有一些
IF
s,但在
CriteriaQuery
构造中也会有