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

如何使用FetchMode。加入JPA?

相温文
2023-03-14

我正在使用Spring Boot,JPA和Hibernate。我有以下实体用户,它与角色有关:

@Table
public class User {

    @OneToMany(fetch = EAGER)
    @JoinColumn(name = "role_id")
    private Set<Role> roles;

    // ...

}

当我读取一个用户时,Hibernate会为每个附加角色生成一个选择,而不是使用加入。在纯Hibernate中,我将通过添加来解决这个问题

@Fetch(FetchMode.JOIN)

但这似乎没有任何影响。

是否可以为有关此实体的所有查询设置首选提取模式?

我找到的一种解决方法,我真的认为这是一种解决方法,因为我需要为每个查询指定它,是这样的:

public List<User> findById(long userId){

        Specification<User> spec = (root, criteriaQuery, criteriaBuilder) ->
        {
            criteriaQuery.distinct(true);
            root.fetch("roles", JoinType.LEFT);
            return criteriaBuilder.equal(root.get("id"), userId);
        };

        return repository.findAll(spec);
    } 

共有1个答案

连坚白
2023-03-14

很晚了,但您需要定义父实体和相关实体之间的联接

Join<MyEntity, RelatedEntity> join = root.join("relatedEntity");
root.fetch("relatedEntity");
 类似资料:
  • 问题内容: 我确实在项目中的三个模型对象之间有关系(文章末尾的模型和存储库片段)。 当我调用它时,会触发三个选择查询: (“ sql”) (对我而言)这是非常不正常的行为。据阅读Hibernate文档后所知,它应该始终使用JOIN查询。在类中更改为 查询时(带有附加SELECT 的查询)没有任何区别,而在类更改为 (使用JOIN查询时)则没有变化。 当我使用抑制射击时,有两个选择: 我的目标是在所

  • 我的项目中的三个模型对象(本文末尾的模型和存储库片段)之间确实存在关系。 当我调用时,它会触发三个select查询: (“sql”) (对我来说)那是相当不寻常的行为。在阅读Hibernate文档后,我认为它应该始终使用连接查询。当类中的更改为时,查询没有区别(使用附加选择进行查询),当更改为时,城市类的查询也一样(使用JOIN进行查询)。 当我使用抑制火灾时,有两种选择: 我的目标是在所有情况下

  • 问题内容: 我需要在此表上使用“自我联接”。 我需要使用自我加入来获得与土耳其同年的国家。仅显示国家和年份。 这就是我想要做的。 ^谷歌自我加入,并做到了。 我只得到土耳其。我究竟做错了什么? 问题答案: 你好亲密! 因为您说的是显示A的国家和年份,并限制了土耳其,所以您将只看到土耳其。您需要将selects更改为and 或将where子句更改为。 这是使用交叉联接的,表中的记录越多,交叉联接的速

  • 问题内容: 我目前正在从Hibernate切换到纯JPA 2(顺便说一句,这比我最初预期的要耗时得多)。 到目前为止,我遇到的最大问题是找到一种方法来强制加载懒惰的属性。 使用Hibernate可以使用:完成;。 使用JPA 2有什么方法吗? 问题答案: 尝试这个: 假设您的实体与实体之间存在一对一的关系。

  • 问题内容: 我有一个PreparedStatement,例如: 如您所见,Employee表具有一个自动递增的ID。我基本上也需要使用prepareStatement自动添加它。有人可以告诉我我要去哪里哪里并纠正我吗?现在,这只是给我一个与Statement相关的错误。 问题答案: 将该列 完全 放在语句之外。它将由数据库引擎生成。您的查询应为: __ 其次,您必须先执行插入操作,然后再从结果中取

  • 本文向大家介绍如何引入scss?引入后如何使用?相关面试题,主要包含被问及如何引入scss?引入后如何使用?时的应答技巧和注意事项,需要的朋友参考一下 安装scss依赖包: 在build文件夹下修改 webpack.base.conf.js 文件: 在 module 下的 rules 里添加配置,如下: 应用: 在vue文件中应用scss时,需要在style样式标签上添加lang="scss",即