java - 列表中的列表。标准 API
问题描述
我有两个实体:
实体:
@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
使用标准 API 包含 AEntity 名称列表来从数据库中加载所有 BEntities。
例子:
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
表达式来实现这个,但它无法在列表中找到列表:(
解决方案
我还没有尝试过,但它可能会这样工作:
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();
}
推荐阅读
- game-engine - 你如何处理游戏战斗连击?- 从头开始 3.0
- asp.net - 如何显示基于特定视图的 en URL 参数
- graph - Janusgraph:无法实例化实现:org.janusgraph.diskstorage.cql.CQLStoreManager
- python - 在 python opencv 中,有没有办法匹配彩色图像的关键点?
- php - Traylabs/oracle-storage PHP web API 集成解决方案
- c# - 如何将未知类型的对象传递给函数
- tensorflow - tensorflow 2.0 keras 将模型保存到 hdfs:不能减少 id 引用计数
- python - WxPython:在面板中嵌套面板
- react-native - React-native 应用程序一直在模拟器上停止
- r - 用于替换列表分隔符和字符串结尾的可变长度负向后查找