假如有這么三個物體 User 、Orders、 Role,關系如下
User和Orders是一對多的關系
User和Role也是一對多的關系
物體內容如下
class User{
private Long id;
private String name;
private xxx; //其他屬性不再羅列
@OneToMany(mappedBy="user")
private Set<Orders> orders;
@OneToMany(mappedBy="user")
private Set<Roles> roles;
}
class Orders{
private Long id;
private String order_num;
private xxx; //其他屬性不再羅列
@ManyToOne
@JoinColumn(name="userId")
private User user;
}
class Roles{
private Long id;
private String name;
private String desc;
private xxx; //其他屬性不再羅列
@ManyToOne
@JoinColumn(name="userId")
private User user;
}
當我想自定義查詢某些欄位時可以使用 如下sql(sql="select id,name from Users where xxx")。但是此時查詢出來的物體中不包含Set<Orders>這個資料。
那么問題來了,我如何自定義查詢物體中的一個一對多關系,如:執行查詢User物體中 id,name, Set<Orders>這些屬性,而不去級聯查詢Role這個表,并且映射成User物體如何查詢呢。即查詢結果是一個List<User> User中有id,name,和集合Set<Orders>
uj5u.com熱心網友回復:
可以使用 jpql+vo,大致是這樣
select new UserOrderVo(u.id,u.name,u.orders) from user u;
前提需要添加一個 UserOrderVo 構造器,引數型別就是上面的構造型別
uj5u.com熱心網友回復:
如果是基本欄位 比如id,name這是可以的,但是 u.orders這個是不行的
uj5u.com熱心網友回復:
select u from User u where xxx;這種會自動封裝的。如果配置了延遲加載,會在呼叫的時候去查詢集合,如果延遲加載為false,第一次查詢的時候就會查詢出來
uj5u.com熱心網友回復:
因為使用rest風格,就算配置了懶加載,在json序列化時,也會去查詢,我就是不想做無用的查詢,這樣效率可能會很低(當資料大的時候)。所以我想自定義查詢,用什么資料,那我就去查什么資料
uj5u.com熱心網友回復:
一對多的時候,需要把控制權放在多的一方。這樣查詢一的那方就不會加載多的一方。uj5u.com熱心網友回復:
大哥有解決方法了嗎?這問題應該很常見啊,為什么百度上一個都沒有轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/133921.html
標籤:Java EE
上一篇:Nginx_Tassl配置時,提示command not found!!!
下一篇:oracle中sql優化
