jpasql查詢語句
Ⅰ JPA使用原生sql結果集轉換成Map
知爛 JPA中使用原生sql查詢出的結果中每一條記錄是object數組,如下所示
String sql = "select id,group_name from form_temp_type";
Query query = entityManager.createNativeQuery(sql);
List<Object[]> list = query.getResultList();//最終的結果集是object數組
我們在使用的時候需要從數組中逐個取出,比較麻煩。很多情況下我們需要的是對象或者Map.
String sql = "select id,group_name from form_temp_type";
Query query = entityManager.createNativeQuery(sql);
query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List<Map> list = query.getResultList();//這里的結果是Map,我們可以通過欄位名稱獲取到相應的值
public static List findRelatives(Stringsql,Map<String,Object>params,EntityManagerentityManager,Class<?>clazz){
Sessionsession=entityManager.unwrap(Session.class);
NativeQueryquery=session.createNativeQuery(sql);
query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(clazz));
爛穗 for(Stringkey:params.keySet()){
Objectvalue=params.get(key);
飢猛卜query.setParameter(key,value);
}
entityManager.close();
returnquery.getResultList();
}
Ⅱ 原生sql查詢怎樣返回page對象
最近由於需求變更,客戶需要在原來的查詢基礎上加上一個判斷條件,但是這個判斷條件所在的實體跟原來的查詢實體沒有直接關聯。為了不影響原來的查詢結果,改為用原生SQL,使用left join來關聯查詢。為了不改變對查詢結果的處理邏輯,將查詢結果封裝成原來的對象進行操作。具體操作方法如下:
1.基於JPA規范的程序:
Query query = entityManager.createNativeQuery("select id, name, age from t_user");
query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(clazz));
// 其中clazz為封裝對象的class
List rows = query.getResultList();
2.基於Session的程序:
sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS").setResultTransformer(Transformers.aliasToBean(clazz));
這兩種方法需要注意的是查詢的欄位的別名需要跟clazz的屬性對應。
Ⅲ jpa 中的自定義sql語句 distinct能用嗎
首先要解釋的是:Distinct是避免 查詢里的重復行,不是針對某一列的。
簡單舉例,數據表這樣寫:
姓名 年齡 性別
----------------------
張三 男 25
李四 女 25
王五 男 42
那麼我這么寫:
select distinct * from 表名
毫無效果,因為壓根就沒重復行,如果把語句減少一個查詢欄位:
select distinct 年齡 from 表名
那結果就只有兩條了