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

如何在实体之间创建JPA规范连接

郎聪
2023-03-14

我想创建基于JPA规范的过滤器。我正在使用Spring数据。

我的实体:

public class Section {

    /*some other fields*/

    @OneToMany
    @JoinTable(
            name = "section_objective",
            joinColumns = @JoinColumn(name = "section_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "objective_id", referencedColumnName = "id")
    )
    private List<Objective> objectives;

}
public class Objective {

    /*some other fields*/

    @OneToMany
    @JoinTable(
            name = "objective_question",
            joinColumns = @JoinColumn(name = "objective_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "question_id", referencedColumnName = "id")
    )
    private List<Question> questions = new ArrayList<>();
}
public class Question {

    /*some fields, below code is not important*/

}

实体依赖项为:第1节-一对多-

我有一个转换为规范的问题过滤器类。我想了解第节中的所有问题。

通常,我会使用下面编写的SQL查询来获取部分中的所有问题。

SELECT q.*
FROM
  question q
JOIN
  objective_question oq ON oq.question_id = q.id
JOIN
  objective o ON o.id = oq.objective_id
JOIN
  section_objective so ON so.objective_id = o.id
JOIN
  section s ON s.id = so.section_id
WHERE
  s.id IN (1,2);

我尝试过使用Join创建规范,但不知道如何在问题上的目标参考不可用时创建连接。

Specification.<Question>where((root, query, criteriaBuilder) ->
        root.join("section") /*throws error because **section** is not a part of attribute on Question */
                .in(List.of(1L, 2L)));

共有1个答案

楚浩然
2023-03-14

您可以使用以下库:https://github.com/turkraft/spring-filter

它将允许您运行搜索查询,例如:

/搜索?过滤器=平均值(额定值)

即使您没有API,您也可以运行搜索查询,如果您愿意,该库基本上会将搜索输入编译为JPA谓词或规范。它将顺利处理您的所有连接查询,而无需担心众所周知的n 1查询问题。

您可以按照以下方式构建规范:

import static com.turkraft.springfilter.FilterBuilder.*;
Specification<Section> spec = new FilterSpecification<Section>(
  and(
    in("id", numbers(1, 2, 3)),
    equal("objectives.questions.field", "some value")
  )
);
// basically telling: get the sections which have id 1, 2 or 3, AND which have the field 'field' of the objectives questions' equal to 'some value'

您无需配置任何内容,只需导入依赖项:

<dependency>
    <groupId>com.turkraft</groupId>
    <artifactId>spring-filter</artifactId>
    <version>1.0.2</version>
</dependency>
 类似资料:
  • 我有一个相当大的系统,它的规范是由子实体上的几个方法构建的。所以我有一个用户,他有一个宠物木偶,就像这个问题一样。我的关系是双向的,所以Pet在用户上也有多对一的关系,我正在努力将子实体上的规范转换为应用于父实体。 我查找的大多数问题都显示了如何在不同的实体上应用规范,或者在规范执行后获得不同的实体。这不是我想要的。 我试着写一个这样的方法: 但我不知道如何编写它(我尝试过使用Join,但没能“告

  • Java类可以很容易地转换成实体。 对于实体转换,基本要求是 - 无参数构造函数 注解 在这里,我们将学习如何通过示例,学习将常规Java类转换为实体类 - 简单的一个学生类(Student),代码如下 - 上面的类是一个常规的java类,有三个属性: , 和 。要将此类转换为实体,请在此类中添加和注解。 - 这是一个标记注释,表明这个类是一个实体。这个注释必须放在类名称上。 - 此注释位于持有持

  • 我正在尝试将查询转换为JPA规范,该查询包含带OR条件的连接操作。 以下是查询: 我试图编写一个规范,但在如何将多个列与OR条件连接方面遇到了障碍。 用户实体: 运营实体 我希望有一个规范来取代上面的查询

  • 问题内容: 我的JPA / Hibernate应用程序中有几个映射的对象。在网络上,我收到的数据包代表这些对象的更新,或者实际上可能完全代表新的对象。 我想写一个像 如果数据库中存在一个带有pk primaryKey的对象,则该对象将返回所提供类的一个对象,否则将创建该类的新对象,并将其持久化并返回。 接下来我将要处理的对象是在事务中更新其所有字段。 在JPA中是否有惯用的方法来执行此操作,还是有

  • 我有下面的查询,其中两个表连接在非主列上。该表连接到一个公用列上。 用户详细信息 如何在JPA规范中实现相同的查询

  • 问题内容: 我的JPA / Hibernate应用程序中有几个映射的对象。在网络上,我收到的数据包代表这些对象的更新,或者实际上可能完全代表新的对象。 我想写一个像 如果数据库中存在一个带有pk primaryKey的对象,则该对象将返回所提供类的一个对象,否则将创建该类的新对象,并将其持久化并返回。 接下来,我将使用该对象来更新事务中的所有字段。 在JPA中是否有惯用的方法来执行此操作,还是有更