没有关系实体的 JPA 存储库 select
JPA Repository select without relationship entity
我有两个实体(休眠)有关系。当我通过 JPA Reposiotory 获取实体时,hibernate 会为两个实体执行 'select'。我如何通过一个 select 获得实体(此时我不需要第二个实体)。
对不起我的英语和技术语言 - 我是初学者。
编辑
用户:
@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);
}
方法 findByNameQuery
和 findByName
都执行多个 select
改变
@OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
private List<Medicament> medicaments;
至
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<Medicament> medicaments;
或者根本不指定 FetchType。 @OneToMany
和 @ManyToMany
的默认值是 LAZY
,@OneToOne
的默认值是 EAGER
@Tomas Kralik 它正在工作!谢谢!
你能告诉我什么更好用吗?
具有 LAZY 获取并在控制器中使用它的实体:
User user = userRepository.findByName(name);
List<Medicament> medicaments = medicamentRepository.findByUser(user);
或使用 EAGER 获取并使用此代码:
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();
我有两个实体(休眠)有关系。当我通过 JPA Reposiotory 获取实体时,hibernate 会为两个实体执行 'select'。我如何通过一个 select 获得实体(此时我不需要第二个实体)。
对不起我的英语和技术语言 - 我是初学者。
编辑
用户:
@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);
}
方法 findByNameQuery
和 findByName
都执行多个 select
改变
@OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
private List<Medicament> medicaments;
至
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<Medicament> medicaments;
或者根本不指定 FetchType。 @OneToMany
和 @ManyToMany
的默认值是 LAZY
,@OneToOne
EAGER
@Tomas Kralik 它正在工作!谢谢!
你能告诉我什么更好用吗?
具有 LAZY 获取并在控制器中使用它的实体:
User user = userRepository.findByName(name);
List<Medicament> medicaments = medicamentRepository.findByUser(user);
或使用 EAGER 获取并使用此代码:
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();