How to write this query using JPA Criteria query?

后端 未结 2 626
攒了一身酷
攒了一身酷 2021-02-04 14:39

Can anyone help me to get the JPA criteria query for the JPA query mentioned below.

SELECT p,l FROM Person p 
LEFT JOIN Language l ON (p.language = l.language an         


        
2条回答
  •  轻奢々
    轻奢々 (楼主)
    2021-02-04 15:32

    Although the answer given by johncarl was accepted it doesn't look correct to me. The JavaDocs for CriteriaQuery.where() say:

    Modify the query to restrict the query result according to the specified boolean expression. Replaces the previously added restriction(s), if any.

    As I understand it, each of the following lines (giving restrictions) will override the restrictions given previously:

    criteria.where(builder.like(langJoin.get(Language_.locale), locale));
    criteria.where(builder.like(pRoot.get(Person_.name), name));
    criteria.where(builder.between(pRoot.get(Person_.time), startDate, endDate));
    

    This means that in the end only the last restriction (between start and end date) would remain.

    I threfore suggest following modifications to johncarl's answer:

    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery criteria = builder.createCriteria(Person.class);
    Root pRoot = criteria.from(Person.class);
    Join langJoin = criteria.join("language", JoinType.LEFT);
    
    Predicate[] restrictions = new Predicate[] { 
        builder.like(langJoin.get(Language_.locale), locale),
        builder.like(pRoot.get(Person_.name), name),
        builder.between(pRoot.get(Person_.time), startDate, endDate)
    };
    
    criteria.where(builder.and(restrictions));
    
    criteria.orderBy(builder.asc(pRoot.get(Person_.name)));
    

    However, this code looks really ugly! Please, feel free to edit if it's wrong and comment it if you see a better solution! I'd be gracefull!

提交回复
热议问题