当前位置: 首页 > 知识库问答 >
问题:

@许多JPA 2复杂查询

凌朗
2023-03-14

我得到了以下许多映射。

@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;

共有3个答案

云骏奇
2023-03-14

还有一些部分不是很清楚,因为我没有看到连接表值中的类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;
    }
}
周楷
2023-03-14

首先,在您的班级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-列表类型的对象

微生嘉
2023-03-14

以下是有帮助的查询:

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”