我有這些物體(是一個例子,因為我不能分享實名物體):
@Entity
public class User { @Id private BigDecimal id; private String name, private Color favouriteColor }
@Entity
public class Color { @Id private Long colorId; private String colorName;}
在表中,我有以下資料:
USER
ID|NAME|FavColor
1 |John| 1
2 |Sarah| 2
3 |Mike| 1
COLOR
1|Red
2|Blue
現在我想進行一個查詢來恢復我所有的用戶資料而不選擇顏色物體,只有它的 id。
@Query("new myDto(u.iduser,u.username,u.favcolor) from user u where favcolor in :listcolors")
這讓我查詢了兩個表,我想要一個唯一的查詢,因為我不需要顏色物體,只需要 id。
--
我正在測驗的其他選項是實作這樣的本機查詢:
final List<MyDTO> result = new ArrayList<>();
Query q = entityManager.createNativeQuery("SELECT "
" USER_ID, "
" USER_NAME, "
" FAV_COLOR "
"FROM USER "
"WHERE FAV_COLOR IN (?)");
q.setParameter(1, colors.toString().replace("[","").replace("]",""));
Long TRUE = new Long(1L);
final List<Object[]> resultList = q.getResultList();
for (Object[] objects : resultList) {
MyDTOdto = new MyDTO();
dto.userId(((((BigDecimal) objects[0]) != null) ? ((BigDecimal) objects[0]).longValue() : null));
dto.userName(((((String) objects[0]) != null) ? ((String) objects[0]).longValue() : null));
dto.favColor(((((BigDecimal) objects[0]) != null) ? ((BigDecimal) objects[0]).longValue() : null));
result.add(dto);
}
return result;
在這種情況下,我收到錯誤代碼(ORA-1722 - 號碼無效)。我不知道我現在可以測驗什么。一些想法?謝謝
uj5u.com熱心網友回復:
我猜您在生成的 SQL 和使用內連接方面存在問題:當您在 select 子句中呼叫“u.favcolor”時,您是在告訴 JPA 根據 favcolor 關系執行從用戶到顏色的內連接。由于 favcolor 是一個顏色參考,您將獲得全彩色行,而您的本機查詢意味著您只需要外鍵值。如果您想要的只是 Color 中的 fk/ID 值,則查詢應該是:
"SELECT new myDto(u.iduser, u.username, color.id) FROM user u join u.favcolor color WHERE color.id in :listcolors"
這仍然可能執行從用戶到顏色的內部連接,但它應該在單個陳述句中。
如果您想確保避免加入:
使用 EclipseLink 的COLUMN JPQL 擴展直接訪問外鍵列。就像是:
"SELECT new myDto(u.iduser, u.username, COLUMN('FAV_COLOR', u) FROM user u join u.favcolor color WHERE COLUMN('FAV_COLOR', u) in :listcolors"使用 EclipseLink 本機查詢鍵功能直接訪問 USER 表中的“FAV_COLOR”外鍵列以進行 JPQL 查詢。這需要描述符定制器才能訪問,但允許您直接在 JPQL 查詢中使用外鍵值,而無需映射它,并且沒有 COLUMN 機制將您的 JPQL 查詢系結到特定的資料庫表詳細資訊。這將允許以下形式的查詢:
"SELECT new myDto(u.iduser, u.username, u.favColorVal FROM user u join u.favcolor color WHERE u.favColorVal in :listcolors"只需將 FAV_COLOR 映射為基本映射,除了現有的 favColor 參考映射(或根據需要替換它):
@Basic @Column(name="FAV_COLOR", updatable=false, insertable=false) BigDecimal favColorId
然后,這允許您使用查詢“SELECT new myDto(u.iduser, u.username, u.favColorId FROM user u join u.favColorId color WHERE u.favColorId in :listcolors”達到相同的效果,但您也可以只回傳User 實體(將 favColor 標記為惰性且不可序列化),因為無論如何它將具有相同的資料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/454153.html
