【问题标题】:JPA Criteria with ElementCollection使用 ElementCollection 的 JPA 标准
【发布时间】:2016-11-18 02:02:23
【问题描述】:

我有类似的东西:

@Entity
public class Person {

    @ElementCollection
    private List<String> emails;
    ...
}

如何将以下 JPQL 转换为条件查询:

select p from Person p
where exists (
    select 1 
    from p.emails e
    where e like :email
)

【问题讨论】:

    标签: java jpa jpql criteria-api


    【解决方案1】:

    如果您真的不需要LIKE 的强大功能并且完全匹配就足够了,您可以检查emails 是否包含email

    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<Person> criteria = builder.createQuery(Person.class);
    Root<Person> p = criteria.from(Person.class);
    criteria.select(p);
    
    
    Expression<List<String>> emails = p.get(Person_.emails);
    criteria.where(builder.isMember("[email address]", emails));
    
    
    TypedQuery<Person> tq = entityManager.createQuery(criteria);
    List<Person> persons = tq.getResultList();
    

    请注意,p.get(Person_.emails) 需要 Person 类的静态元模型。如果你没有那个,你可以用p.get("emails") 替换那个部分,但会牺牲类型安全。

    如果您确实需要执行LIKE,则必须加入该集合。

    Join<Person, String> emailJoin = p.join(Person_.emails);
    criteria.where(builder.like(emailJoin, "[email address]"));
    criteria.distinct(true);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      • 2011-06-25
      相关资源
      最近更新 更多