【问题标题】:JPA Repository select without relationship entity没有关系实体的 JPA 存储库选择
【发布时间】:2016-06-08 02:43:05
【问题描述】:

我有两个有关系的实体(休眠)。当我通过 JPA Reposiotory 获取实体时,然后休眠为两个实体“选择”。如何通过一次选择获得实体(此时我不需要第二个实体)。

对不起,我的英语和技术语言 - 我是初学者。

编辑

用户:

@Entity
public class User {

@Id
@GeneratedValue
private int id;

private String name;

@OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
private List<Medicament> medicaments;

//and others and getters and setters
}

药剂:

@Entity
public class Medicament {

@Id
@GeneratedValue
private int id;

private String name;

@ManyToOne
@JoinColumn(name = "user_id")
private User user;

//and others and getters and setters
}

我从自动装配接口 UserRepository 调用方法:

public interface UserRepository extends JpaRepository<User, Integer>{

@Query("select u from User u where name = :name")
User findByNameQuery(@Param("name") String name);

User findByName(String name);
}

findByNameQueryfindByName 方法都进行多选

【问题讨论】:

  • 如果您使用 Criteria api,您可以使用setFetchMode(FetchMode.LAZY),也可以在您的关系注释中指定fetch=FetchType.LAZY
  • 贴出这些实体的代码
  • 我添加了实体; @Pragnani Kinnera 如何在我的代码中使用 setFetchMode?​​span>
  • @PragnaniKinnera Criteria api you can use setFetchMode(FetchMode.LAZY)。我认为这行不通。它反过来工作。我们可以在实体映射中将关系定义为 LAZY,并使用 Criteria 我们可以使用FetchMode.EAGER 快速获取它。但是一旦我们在实体映射本身中将它指定为 EAGER,就不能使用 Criteria 或 HQL 来更改它来加载它 LAZY。您可能想尝试一下。

标签: java spring hibernate jpa jpql


【解决方案1】:

改变

@OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
private List<Medicament> medicaments;

@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<Medicament> medicaments;

或者根本不指定 FetchType。 @OneToMany@ManyToMany 的默认值为 LAZYEAGER 对于 @OneToOne

【讨论】:

  • 很高兴你能成功。当您想对某人的回答做出反应时,请使用 cmets。肯定用第二个sn-p,你可以用getter来获取相关实体——这就是JPA的魅力:)不管你用LAZY还是EAGER都没有关系。唯一的区别是运行“第二个”查询的时间。当您使用EAGER 时,会立即查找所有相关实体。如果您使用LAZY 加载,则在您访问属性/getter 时会查找相关实体。如果对您有帮助,请将此答案标记为已接受:)
【解决方案2】:

@Tomas Kralik 成功了!谢谢!

你能告诉我什么更好用吗?

具有 LAZY 获取的实体并在控制器中使用它:

User user = userRepository.findByName(name);
List<Medicament> medicaments = medicamentRepository.findByUser(user);

或使用 EAGER fetch 并使用此代码:

User user = userRepository.findByName(name);
List<Medicament> medicaments = user.getMedicaments();

或者,如果需要,我可以更改此设置(在一种方式中,我将实体与 fetch EAGER 一起使用,在另一种方式中,我将同一实体与 fetch LAZY 一起使用)?

编辑:

我找到了解决方案: 我已将查询更改为:

@Query("select u from User u JOIN FETCH u.medicaments m where u.name = :name")
User findByNameQuery(@Param("name") String name);

实体用户已获取 LAZY,在我使用的控制器中:

User user = userService.findByName(name);
List<Medicament> medicaments = user.getMedicaments();

【讨论】:

  • 您甚至不必在查询中使用JOIN,因为您已经获得了使用注释指定的关系。 Hibernate 完成所有工作。简单的@Query("select u from User u WHERE u.name = :name") 应该可以做到
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 2020-04-12
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 2013-09-24
相关资源
最近更新 更多