gpt4 book ai didi

JAVA EclipseLink 可选查询参数

转载 作者:行者123 更新时间:2023-12-02 11:50:16 25 4
gpt4 key购买 nike

我有一个查询,可以按某些条件过滤项目:

@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 语法,如果值为空,是否可以动态地将其作为 '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 构造中也会如此。

关于JAVA EclipseLink 可选查询参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47920402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com