簡體   English   中英

具有一對多和多對一關系的CriteriaQuery

[英]CriteriaQuery with One-to-Many and Many-to-One Relationships

我有3個表有問題:PrblFldr-> PrblFldrAtrbtVal-> PrblTmpltAtrbt。 這些之間的關系分別是“一對多”和“多對一”。

我正在使用CriteriaBuilderPrblFldr對象執行搜索。 我需要每個值來搜索PrblFldrAtrbtVal與該關聯PrblFldr 查詢參數的鍵是使每個PrblFldrAtrbtValPrblTmpltAtrbt相關聯的唯一PK; 參數的值是在PrblFldrAtrbtVal的值中搜索的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對象進行匹配的事實,但仍返回空白結果集。

我認為這事做與cb.and()中聲明cq.where()子句。 我確實想要一個“與”,但是為什么不返回任何結果呢?

查詢返回一個空列表,因為謂詞添加了“ AND”。 即,正在生成的查詢類似於:

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

當您傳遞多個鍵/值對時。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM