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

spring data JPA忽略查询方法上的fetchmode

毕霖
2023-03-14

我有具有传递关系的实体。因此实体A被单独映射到实体B,实体B被单独映射到实体C。实体A有一个属性userID,它不是主键,我需要从DB中获取用户ID的所有记录。由于要求,我急切地想要取A和B的孩子记录。我已经用FetchMode join注释了实体,并且我的存储库有一个方法findByUserId(int userId)。我使用spring data JPA和hibernate作为底层ORM。执行上面的查询方法会激发多个查询,尽管我希望只有一个带有join的查询会被激发。

我已经尝试过EntityGraphs,用NamedQuery注释了我的存储库方法,尝试过将实体映射到多个实体之间的双向映射,但似乎都行不通。

@Entity
@Table(name = "A_Master")
public class EntityA{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    private int userId;

    @OneToMany(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "FK_reservationId")
    @Fetch(FetchMode.JOIN)
    private List<EntityB> bEntities= new ArrayList<>();

}

@Entity
@Table(name = "Entity_B")
public class EntityB{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    @OneToMany(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "FK_journeyId")
    @Fetch(FetchMode.JOIN)
    private List<EntityC> cEntities = new ArrayList<>();
}

public interface ReservationRepository extends JpaRepository<EntityA, Integer>
{
    public List<EntityA> findByUserIdAndStatus(String userId);
}

共有1个答案

经昱
2023-03-14

FetchType定义如何加载集合。是立即加载还是懒洋洋(按需)加载。

相反,fetchmode定义了加载集合的机制。当您将收藏标记为:

@OneToMany(cascade = CascadeType.PERSIST)
@Fetch(FetchMode.JOIN)

这是无稽之谈,因为默认情况下OneToMany的fetchtype是惰性的,但您不能在惰性集合上使用联接机制。为了有一个连接,您需要将其设置为Eager。

 类似资料:
  • 问题内容: 什么是运行查询以便忽略字段中的空格的最佳方法?例如,以下查询: 将找到以下条目: 我正在使用php或python,但我认为这没有关系。 问题答案:

  • 问题内容: 我正在寻找一种创建忽略空格的学说查询的方法。我尝试用replace,但是我一直都收到 预期的已知功能,得到“替换” 我的查询看起来像: 问题答案: 好的,我编写了一个替换DQL函数。 接下来在app / config.yml中,我添加: 最后,我在控制器中创建了一个DQL查询: 最有趣的是,“引号”非常重要。这意味着您可以在select,from,setParameter和orderB

  • Spring Hateoas没有为以下请求映射创建适当的链接: 致电/会员/12345时,您希望返回: 但相反,它返回: 这是为什么?即使我使用@Request estParam,它也完全忽略了过滤器。在这件事上,任何建议都将受到赞赏。

  • 以下策略可用于仓库基础结构来解决查询。你可以在XML配置中的命名空间通过query-lookup-strategy属性来配置策略或者在JAVA配置中通过Enable${store}Repositories声明queryLookupStrategy属性。有些策略可能对于特别的datastores并不支持。 CREATE 从查询方法名来尝试构建一个特别的数据查询。一般的方法都是从方法名称中移除已知设定

  • 问题内容: 我有一个由不同线程同时读取的表。 每个线程必须选择100行,在每行上执行一些任务(与数据库无关),然后它们必须从表中删除选定的行。 使用此查询选择行: 我的问题是:如何忽略(或跳过)以前使用MySQL中的select语句锁定的行? 问题答案: 我通常创建一个默认为NULL的process_id列,然后让每个线程使用唯一的标识符来执行以下操作: 这样可以确保每个线程从表中选择唯一的行集。

  • 问题内容: 我需要从第二个表中选择一些行,并将它们连接成逗号分隔的字符串。除一个问题外,查询效果很好-它始终选择所有行,并忽略LIMIT。 这是我的查询的一部分,该查询获取该字符串并忽略LIMIT: 完整查询: 问题答案: LIMIT子句限制最终结果集中的行数,而不是用于在GROUP_CONCAT中构造字符串的行数。由于您的查询在最终结果中仅返回一行,因此LIMIT无效。 您可以通过使用LIMIT