簡體   English   中英

如何在JPA中檢查聯接列是否包含具有條件的數據

[英]How to check in JPA if joined column contains data with condition

我有兩張桌子。

人和他的假期計划。 對於這個問題,我們需要知道的是Person包含ID,vp包含此ID作為外鍵,以及年和開始日期的結束日期。 人可以包含更多的vp。 從而

    Person          VacPlan
    _______        ____________
   |id     |----->|pers_id     |
                  |year        |
                  |start date  |
                  |end date    |

我需要選擇在指定年份內在vp中沒有單一記錄的每個人。

像這樣: select from person where (joined vp where vp.year = :year) is not empty

您是否有任何想法如何在JPA中做到這一點(eclipse鏈接)

編輯:這是標准的樣子

List<Predicate> predicates = new ArrayList<>();
List<Predicate> subPredicates = new ArrayList<>();
CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
CriteriaQuery<PersonVP> q = cb.createQuery(PersonVP.class);
Root<PersonVP> person = q.from(PersonVP.class);

Subquery<VacationPlanning> subquery = q.subquery(VacationPlanning.class);
Root<VacationPlanning> subRoot = subquery.from(VacationPlanning.class);

Expression<String> exp = person.get("personnelNumber");
subPredicates.add(cb.equal(subRoot.get("year"), year));
subPredicates.add(cb.equal(exp, subRoot.get("perNr")));
subquery.where(cb.and(subPredicates.toArray(new Predicate[subPredicates.size()])));

if (STATUS.FILLED.equals(searchFillStatus)) {
    predicates.add(cb.and(cb.exists(subquery)));
} else if (STATUS.NOT_FILLED.equals(searchFillStatus)) {
    predicates.add(cb.and(cb.not(cb.exists(subquery))));
}

q.where(cb.and(predicates.toArray(new Predicate[predicates.size()])));

q.select(person);
TypedQuery<PersonVP> query = getEntityManager().createQuery(q);

return query.setFirstResult(from)
        .setMaxResults(to)
        .getResultList();

這樣的事情應該起作用:

select p from Person p where not exists(
    select vp.id from Person p2 
    join p2.vacPlans vp
    where p2.id = p.id
    and vp.year = :year)

試試看:

SELECT p.id 
FROM person p 
WHERE p.id NOT IN (SELECT DISTINCT(vp.pers_id)
              FROM VacPlan vp)

您可以將NamedQuery用於此作業。 您可以在個人實體文件中使用@JB Nizet查詢聲明NamedQuery ,如下所示:

@NamedQuery(name="VpForYear", query="select p from Person p where not exists(
    select vp.id from Person p2 
    join p2.vacPlans vp
    where p2.id = p.id
    and vp.year = :year)")

您可以像這樣使用此NamedQuery

Query query = em.createNamedQuery("VpForYear");
query.setParameter("year", 2016);

暫無
暫無

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

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