没有关系实体的JPA存储库选择

时间:2016-02-25 11:00:03

标签: java spring hibernate jpa jpql

我有两个有关系的实体(休眠)。当我通过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);
}

方法findByNameQueryfindByName都会进行多次选择

2 个答案:

答案 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的默认设置为LAZYEAGER的默认设置为@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();