JAVA EclipseLink可选查询参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA EclipseLink可选查询参数相关的知识,希望对你有一定的参考价值。

我有查询按特定条件过滤项目:

@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")
})

在某些情况下,参数idEMGroup o companyId可以为null,它生成的sql看起来像这个IdEmCompany = 200630758) AND (IdEMGroup = NULL)并且它是不正确的sql语法是否可以动态如果值为null为'Column IS NULL'而不是'Column = NULL'而不添加大量的if,或者它只是更好使用Criteria API重写此查询,只检查值是否存在并在某些条件下添加谓词?

答案

正确的答案是使用CriteriaQuery

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

相反,您可以首先将查询构造为String并通过操纵查询字符串创建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);

会有一些IFs,但也将在CriteriaQuery建设。

以上是关于JAVA EclipseLink可选查询参数的主要内容,如果未能解决你的问题,请参考以下文章

hibernate 和eclipselink的区别

EclipseLink - 在执行查询期间从该行读取的主键被检测为空。主键不能包含 null

EclipseLink 错误?简单的原生 SQL 查询异常

Wsdl 可选参数在生成的 java 存根代码中成为必需的

EclipseLink 原生查询和 FetchType 行为

从子句中的jpa eclipselink子查询