我得到了以下许多映射。
@Entity
public class Class1 {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "class1_class2", joinColumns = @JoinColumn(name = "class1Id"), inverseJoinColumns = @JoinColumn(name = "class2Id"))
private List<Class2> class2;
}
@Entity
public class Class2 {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
}
我想检索所有与Classe2实体有关系的Class1实体,它们的类2Id=1和类2Id=2和类2Id=3。{1,2,3}
或者,要筛选在其class2列表上具有值的Class1实体,请使用值class2Id=1、class2Id=2和class2Id=3的class2实体
例如:
如果在联接表上,我得到了以下值。
class1Id class2Id
1 1
1 2
1 3
1 4
6 1
6 2
6 3
4 1
5 2
对于这个例子,结果将是类1Id为1和6的类1。因为类1实体,类1Id=1与类2Id有关联:1,2,3,4而类1实体,类1Id=2与类2Id有关联:1,2,3
是否可以获得使用JPA2(谓词)返回的正确实体?
有没有更好的映射来处理这种情况?
目前,我提出以下SQL问题:
select v1.class1Id from class1_class2 v1
inner join class1_class2 v2 on v1.class1Id=v2.class1Id
inner join class1_class2 v3 on v2.class1Id=v3.class1Id
where v1.classe2Id=1 and v2.classe2Id=2 and v3.classe2Id=3;
还有一些部分不是很清楚,因为我没有看到连接表值中的类1Id=2,或者类1Id=6只有类2Id=1。但是无论如何,我会给你类似的谓词映射示例,这样你就可以根据自己的需要进行修改。我已经使用了静态元模型。你可以将它们移动到你实体类的同一个包中。我当然无法测试,但我相信可以是一个很好的路线图。
JPA 2.0查询:
CriteriaBuilder criteriaBuilder = getEm().getCriteriaBuilder();
CriteriaQuery<Class1> criteriaQuery = criteriaBuilder.createQuery(Class1.class);
Root<Class1> fromClass1 = criteriaQuery.from(Class1.class);
List<Predicate> conditions = new ArrayList<Predicate>();
Subquery<Class2> qry = criteriaQuery.subquery(Class2.class);
Root<Class2> fromClass2 = qry.from(Class2.class);
qry.select(fromClass2);
qry.where(criteriaBuilder.equal(fromClass2.get(Class2_.getId()), idParamGoesHere));
conditions.add(criteriaBuilder.in(.get(Class1_.getClass2()).value(qry));
criteriaQuery.where(conditions.toArray(new Predicate[0]));
TypedQuery<Class1> query = getEm().createQuery(criteriaQuery);
List<Class1> results = query.getResultList();
@StaticMetamodel(Class1.class)
public class Class1_ {
private static volatile SingularAttribute<Class1, Long> id;
private static volatile SingularAttribute<Class1, Class2> class2;
public static SingularAttribute<Class1, Long> getId() {
return id;
}
public static void setId(SingularAttribute<Class1, Long> id) {
Class1_.id = id;
}
public static SingularAttribute<Class1, Class2> getClass2() {
return class2;
}
public static void setClass2(SingularAttribute<Class1, Class2> class2) {
Class1_.class2 = class2;
}
}
静态元模型2类:
@StaticMetamodel(Class2.class)
public class Class2_ {
private static volatile SingularAttribute<Class2, Long> id;
public static SingularAttribute<Class2, Long> getId() {
return id;
}
public static void setId(SingularAttribute<Class2, Long> id) {
Class2_.id = id;
}
}
首先,在您的班级Class2中,您需要添加以下内容:
@ManyToMany(fetch = FetchType.LAZY, mappedBy="class2")
private List<Class1> class1;
在此之后,您的任务应该使用此查询完成:
select c1 from Class1 c1 join c1.class2 c2 where c2.id in ?1 group by c1
哪里1-列表类型的对象
以下是有帮助的查询:
select c1
from Class1 c1
join c1.class2 c2
where c2.id in (1,2,3)
group by c1
having count(c1)=3 ;
问题内容: 我想用cakephp进行这样的查询: 这是我的$ conditions代码: 我正在使用Debugger :: dump()方法显示结果,并且结果仅使用最后一个“ OR”条件,而不是同时使用“ OR”条件: 我的问题是,如何进行查询以同时使用“ OR”条件? 请尽快回复..在此先感谢:) 问题答案: 请尝试以下方法: 将是 任何阵列没有指定,或者是。无需手动指定。
我有这个: 如何从hashlist中排除“item”?打破了我的头。Linq不想对我开放。
问题内容: 我有以下ManyToMany映射。 我想检索与Classe2实体有关系的所有Class1实体,其中class2Id = 1和class2Id = 2和class2Id = 3。{1,2,3} 或者,要过滤在其class2列表上具有的Classe1实体,请使用具有以下值的Class2实体:class2Id = 1和class2Id = 2和class2Id = 3 例如: 如果在联接表上
我有一张这样的桌子: 现在我想创建一个返回经过过滤的数据集的REST APIendpoint: 它应正确筛选API参数的任何组合。 所有参数都是可选的 看看这个示例: 我想要能够过滤基于每个参数或组合的2或参数。 我应该如何编写@RequestParam?这是一个复杂的查询。对此有何策略?
我对规范、构建器、查询不是很有经验,我必须做一个相当复杂的查询,就像这样: 我有一个这样的DTO: 对我来说很难。我什么都试过了。我宁愿给你看一个具体的案例,以免产生误解。有人能帮我吗?我将非常感激! 我不需要使用规范,我只需要能够重现那个查询示例,规范似乎是最好的选择。 谢谢大家。
给定集合"foo",我们有字段"bar",看起来像这样: 如何查询字段“bar”上满足以下条件的所有“foo”:[14,18]中的“uid”=2和“mid”