JAVA EclipseLink 可选查询参数
JAVA EclipseLink optional query parameters
我有按特定条件过滤项目的查询:
@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 可以为空,从而生成 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);
会有一些 IF
,但也会在 CriteriaQuery
建设中。
我有按特定条件过滤项目的查询:
@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 可以为空,从而生成 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);
会有一些 IF
,但也会在 CriteriaQuery
建设中。