Java @许多JPA2复杂查询

Java @许多JPA2复杂查询,java,hibernate,jpa,jpa-2.0,spring-data-jpa,Java,Hibernate,Jpa,Jpa 2.0,Spring Data Jpa,我得到了以下许多映射 @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 =

我得到了以下许多映射

@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;
}
对于本例,结果将是Class1,ClassID为:1和6。 因为class1Id=1的Class1实体与classe2Id:1,2,3,4有关系 class1Id=2的Class1实体与classe2Id: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;

仍然有一些部分在这个问题上不是很清楚,因为我在联接表值中没有看到ClassID=2,或者ClassID=6只有class2Id=1。但无论如何,我会给你们类似的谓词映射示例,这样你们就可以根据自己的需要进行修改。我用过。您可以将它们移动到实体类的同一个包中。我当然无法测试,但我相信这是一个很好的路线图

JPA2.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(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;
    }
}
CriteriaBuilder-CriteriaBuilder=getEm().getCriteriaBuilder();
CriteriaQuery-CriteriaQuery=criteriaBuilder.createQuery(Class1.class);
Root fromClass1=criteriaQuery.from(Class1.class);
列表条件=新建ArrayList();
子查询qry=criteriaQuery.Subquery(Class2.class);
根fromClass2=qry.from(Class2.class);
qry.select(从类别2中选择);
qry.where(criteriaBuilder.equal(fromClass2.get(Class2.getId()),idParamgoesher));
add(criteriaBuilder.in(.get(Class1.getClass2()).value(qry));
其中(conditions.toArray(新谓词[0]);
TypedQuery query=getEm().createQuery(criteriaQuery);
List results=query.getResultList();
静态元模型Class1:(本例不需要,但我已添加)

@StaticMetamodel(Class1.class)
公营一班{
私有静态属性id;
私有静态属性class2;
公共静态属性getId(){
返回id;
}
公共静态无效集合id(属性id){
class.id=id;
}
公共静态属性getClass2(){
返回类2;
}
公共静态无效集合类2(属性类2){
Class1_u2;class2=class2;
}
}
静态元模型类2:

     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(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;
    }
}
@StaticMetamodel(Class2.class)
公共类2_{
私有静态属性id;
公共静态属性getId(){
返回id;
}
公共静态无效集合id(属性id){
Class2_u2;id=id;
}
}
首先,在课堂2中,您需要添加以下内容:

@ManyToMany(fetch = FetchType.LAZY, mappedBy="class2")
private List<Class1> class1;

其中?1-类型为
List
的对象,包含id
{1,2,3}

以下是可以帮助您的查询:

select c1 
from Class1 c1 
join c1.class2 c2 
where c2.id in (1,2,3)
group by c1
having count(c1)=3 ;

你能澄清一下你的问题/例子吗?我添加了更多的澄清HI,因为ClassID=2不需要。ClassID=6的class2Id=1、2和3。你的解决方案不起作用,因为ClassID=4和5I的in子句REUTUR条目已经更新了此字段条件。add(criteriaBuilder.in(.get(Class1_.getClass2()).value(qry));为什么要添加与class2的关系?它是单向关系。您的查询不完整。我正在发布答案!实际上您没有在任何地方指定查询应该是单向的。无论如何,此查询也适用于单向映射。
select c1 
from Class1 c1 
join c1.class2 c2 
where c2.id in (1,2,3)
group by c1
having count(c1)=3 ;