gpt4 book ai didi

java - 具有一对多和多对一关系的 CriteriaQuery

转载 作者:行者123 更新时间:2023-12-01 13:13:38 24 4
gpt4 key购买 nike

我有 3 个有问题的表:PrblFldr --> PrblFldrAtrbtVal --> PrblTmpltAtrbt。它们之间的关系分别是“一对多”和“多对一”。

我正在使用 CriteriaBuilderPrblFldr 对象执行搜索。我需要按与 PrblFldr 关联的每个 PrblFldrAtrbtVal 的值进行搜索。查询参数的键是将每个 PrblFldrAtrbtValPrblTmpltAtrbt 相关联的唯一 PK;参数的值是在 PrblFldrAtrbtVal 的值中搜索的内容。

这是迄今为止我的代码(编辑):

@GET
@Path("/folders/search")
public Response searchFolders(@Context UriInfo uriInfo) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<PrblFldr> cq = cb.createQuery(PrblFldr.class);
Root<PrblFldr> folder = cq.from(PrblFldr.class);
Join<PrblFldr, PrblFldrAtrbtVal> attributes = folder.join("prblFldrAtrbtVals");
Join<PrblFldrAtrbtVal, PrblTmpltAtrbt> attributeTemplates = attributes.join("prblTmpltAtrbt");

List<Predicate> predicates = new ArrayList<Predicate>();
MultivaluedMap<String, String> queryParams = uriInfo.getQueryParameters();

for (String key: queryParams.keySet()) {
String value = queryParams.getFirst(key).replaceAll("_", "\\\\_");

predicates.add(cb.and(cb.equal(attributeTemplates.<String>get("tmpltAtrbtSeqId"), key),
cb.like(attributes.<String>get("fldrAtrbtVal"), "%" + value + "%", '\\')));
}

cq.distinct(true).select(folder).where(cb.and(predicates.toArray(new Predicate[]{})));
List<PrblFldr> results = em.createQuery(cq).getResultList();

return Response.ok(gson.toJson(results), MediaType.APPLICATION_JSON).build();
}

已编辑:如果我只传递一个键/值对进行搜索,它目前就可以工作。如果我传入多个 PrblFldrAtrbtVal 进行搜索,则会返回空白结果集,尽管一个或多个 PrblFldr 对象应与指定的 匹配>PrblFldrAtrbtVal 对象。

我认为这与cq.where()子句中的cb.and()语句有关。我确实想要一个“AND”,但为什么没有返回任何结果?

最佳答案

查询返回空列表,因为谓词添加了“AND”。即,生成的查询类似于;

tmpltAtrbtSeqId = '1' AND fldrAtrbtVal like '%a%'
AND tmpltAtrbtSeqId = '2' AND fldrAtrbtVal like '%b%'
AND tmpltAtrbtSeqId = '3' AND fldrAtrbtVal like '%c%'

当您传入多个键/值对时。

您需要在 for 循环中添加“OR”子句。

关于java - 具有一对多和多对一关系的 CriteriaQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22637643/

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