【问题标题】:List in list. Criteria API列表中的列表。标准 API
【发布时间】:2021-11-07 22:26:29
【问题描述】:

我有两个实体:

实体:

@Entity
@Data
public class AEntity{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

}

B实体:

@Entity
@Data
public class BEntity{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @ManyToMany(fetch = FetchType.EAGER)
    private List<AEntity> aEntities = new LinkedList();
}

我想通过 aEntities 从数据库中加载所有 BEntities,其中包含使用标准 API 的 AEntity 名称列表。

例子:

Database:
AEntities -> {1, "A1"}, {2, "A2"}, {3, "A3"}
BEntities -> {1, AEntities: {1, 2, 3}}, {2, AEntities: {1, 3}}, {3, AEntities: {3}}

如果我调用 mySearchMethod(List.of("A1", "A3")) 它应该返回: {1, AEntities: {1, 2, 3}}, {2, AEntities: {1, 3}} 因为只有这些 BEntities 包含名称为“A1”和“A3”的 AEntities

尝试使用in 表达式实现此功能,但无法在列表中找到列表:(

【问题讨论】:

    标签: java hibernate criteria-api


    【解决方案1】:

    我没有尝试过,但它可能会这样工作:

    public List<BEntity> mySearchMethod(List<String> keyList){
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<BEntity> cq = cb.createQuery(BEntity.class);
        Root<BEntity> r = cq.from(BEntity.class);
            
        cq.select(r);
        ArrayList<Predicate> predicates = new ArrayList<>();
        for(String key : keyList) {
            predicates.add(cb.isMember(key, r.get(BEntity_.aEntities)));
        }
        if(predicates.size() > 0) {
            if(predicates.size() == 1) {
                cq.where(predicates.get(0));
            }else {
                cq.where(cb.and(predicates.toArray(new Predicate[predicates.size()])));
            }
        }
        TypedQuery<BEntity> query = em.createQuery(cq);
    
        return query.getResultList();
    }
    

    【讨论】:

      猜你喜欢
      • 2017-11-30
      • 1970-01-01
      • 2015-04-05
      • 2022-11-29
      • 2014-05-17
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多