2016-02-25 105 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」)'應該這樣做 –