我有两个有关系的实体(休眠)。当我通过JPA Reposiotory获得实体时,hibernate会选择'对于两个实体。如何通过一个选择获得实体(在这一刻我不需要第二个实体)。
对不起我的英语和技术语言 - 我是初学者。
修改
用户:
@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
都会进行多次选择
答案 0 :(得分:1)
更改
@OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
private List<Medicament> medicaments;
到
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<Medicament> medicaments;
或者根本不指定FetchType。 @OneToMany
和@ManyToMany
的默认设置为LAZY
,EAGER
的默认设置为@OneToOne
答案 1 :(得分:0)
@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();
或者我可以改变这个,如果我需要的话(在某种程度上我使用带有获取EAGER的实体,而在其他方面我使用带有获取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();