2016-02-25 73 views
0

我有两个关系的实体(休眠)。当我通过JPA Reposiotory得到实体时,休眠对两个实体做'选择'。我如何通过一个选择获得实体(在这一刻我不需要第二个实体)。JPA仓库选择无关系实体

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

编辑

用户:

@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 
} 

我请从自动装配Autowired接口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

如果您正在使用您可以使用'setFetchMode(FetchMode.LAZY)'的标准API,您也可以在您的关系注释 – Pragnani

+0

中指定'fetch = FetchType.LAZY'这些实体的代码 – WeMakeSoftware

+0

我添加了实体; @Pragnani Kinnera如何在我的代码中使用setFetchMode? –

回答

1

变化

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

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

或者根本就不指定FetchType。为@OneToMany@ManyToMany默认值是@OneToOne

+0

很高兴你有它的工作。请在你想对自己的答案作出反应时使用评论。绝对使用第二个片段,您可以使用getter获取相关实体 - 这就是JPA的魅力:)使用'LAZY'还是'EAGER'并不重要。唯一的区别是当'second'查询运行时。当你使用'EAGER'时,所有相关的实体立即被查找。如果您使用'LAZY'加载,则在访问属性/获取器时会查找相关的实体。将这个答案标记为接受,如果它对你有帮助的话:) –

0

@Tomas KRALIK它的工作LAZYEAGER!谢谢!

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

实体LAZY获取和控制使用:

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

或使用预先抓取,并使用此代码:

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(); 
+0

你甚至不必在查询中使用'JOIN',因为你已经获得了使用注释指定的关系。 Hibernate完成所有工作。简单的'@Query(“从用户u选择你在哪里u.name =:name”)'应该这样做 –