【问题标题】:JAVA EclipseLink optional query parametersJAVA EclipseLink 可选查询参数
【发布时间】:2017-12-21 07:58:10
【问题描述】:

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

@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,这会生成类似于 IdEmCompany = 200630758) AND (IdEMGroup = NULL)sql 并且不正确 sql 语法是否可以动态地将它的值为 null 为 'Column IS NULL' 而不是 'Column = NULL' 而无需添加大量 if,或者最好使用 Criteria API重写此查询> 只需检查值是否存在并在某些条件下添加谓词?

【问题讨论】:

    标签: java database jpa orm persistence


    【解决方案1】:

    正确答案是使用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构造中。

    【讨论】:

      猜你喜欢
      • 2019-04-14
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 2018-09-23
      • 2020-09-08
      • 1970-01-01
      相关资源
      最近更新 更多