hibernate(jpa)根據實體動態生成查詢條件,並實現分頁問題的解決方案
hibernate如何根據傳進去實體的不為空屬性生成動態查詢,並實現分頁,經過檢視hibernate api需要用到Criteria ,但是Criteria 有個缺點就是當另一個表A中某一外來鍵列是該表B的主鍵,如果A表中有兩條記錄對應B表的某一主鍵,則查詢結果中B表的該記錄也會變為兩條,我感到很不理解!最後從網上得知可以用 .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);去掉重複的結果,但實驗之後我發現該語句只在提交的時候(也就是crit.list();的時候)才會去掉重複的結果,而分頁的資料獲取是在crit.list();之前,也就是說分頁是在有重複資料的情況下根據起始位置獲取的資料,顯然是不正確的。後來又得知可以用crit .setProjection(Projections .projectionList()
.add(Projections .distinct(Projections .id()))的方法獲得不重複的主鍵ID,可是Projections 只能指定屬性,無法獲得實體,最後只能用Projections 先獲得id和建立時間(因為這裡是按照建立時間排序的,所以查詢結果中必須有建立時間),然後再根據ID查詢實體,用 .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);去掉重複的結果;
List<ContentInfo> result = (List<ContentInfo>) getHibernateTemplate()
.execute(new HibernateCallback() {
public Object doInHibernate(Session arg0)
throws HibernateException, SQLException {
ContentInfo ci = new ContentInfo();
BUtil.QueryContentBean2ContentInfo(ci, instance);
//根據實體建立Example
Example example = Example.create(ci)
.excludeZeroes().ignoreCase() // perform
.enableLike(); // use like for string
Criteria crit = arg0.createCriteria(
ContentInfo.class).add(example).addOrder(
Order.desc("createtime"));
// .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
// 查詢出滿足查詢條件的內容的不重複id和建立時間
crit .setProjection(Projections .projectionList()
.add(Projections .distinct(Projections .id()))
.add(Projections .property("createtime")));
// 設定分頁的資訊
crit.setFirstResult(PageUtil.getStart(currPage,
pageSize));
crit.setMaxResults(pageSize);
List contentList = crit.list();
//提取出滿足查詢條件的內容的不重複id
if (contentList != null
&& contentList.isEmpty() == false) {
List contentId = new ArrayList();
for (Object ob : contentList) {
Object[] obs = (Object[]) ob;
contentId.add(obs[0]);
}
// 通過內容id再取出內容實體
Criteria crit2 = arg0.createCriteria( ContentInfo.class)
.add( Restrictions.in("contentid",contentId)).addOrder( Order.desc("createtime"))
.setResultTransformer( Criteria.DISTINCT_ROOT_ENTITY);
List<ContentInfo> results = (List<ContentInfo>) crit2 .list();
log.debug("find by example successful, result size: "+ results.size());
return results;
} else {
return null;
}
}
});
注意:
如果實體的主鍵不為空是不參與動態生成查詢條件;
如果實體的屬性中有Long型別的,不要讓它為0,要為null,否則就會生成查詢條件where 屬性***=0,所以有些時候你都不知道為什麼查詢出來的結果為空。當然在這裡是可以控制,在生成example 的時候新增excludeZeroes(),就把0排斥了,但這樣帶來的缺點就是,如果你將某一個Long型別的屬性設為0,期望動態生成where 屬性***=0就不可能了。
相關推薦
hibernate(jpa)根據實體動態生成查詢條件,並實現分頁問題的解決方案
hibernate如何根據傳進去實體的不為空屬性生成動態查詢,並實現分頁,經過檢視hibernate api需要用到Criteria ,但是Criteria 有個缺點就是當另一個表A中某一外來鍵列是該表B的主鍵,如果A表中有兩條記錄對應B表的某一主鍵,則查詢結果中B表的該記錄
hibernate (二):主鍵生成策略
hibernate的主鍵生成器: generator元素:表示了一個主鍵生成器,它用來為持久化類例項生成唯一的標識 主鍵生成器: 1、程式設計師自己控制 assigned 提示:如果hibernate設定了程式設計師自己控制資料庫主鍵設定了自動增長也不會成功
Mybatis入門程式(二)-----------根據使用者名稱稱模糊查詢使用者資訊
1.對映檔案 使用User.xml新增根據使用者名稱稱模糊查詢使用者資訊的sql語句 2.程式碼實現 3.總結 parameter 在對映檔案中通過parameterType指定輸入引數的型別 resultType 在對映檔案中通過resultT
JavaWeb學習(七)HttpServletResponse基本應用——生成驗證碼圖片並提交到伺服器(6)
一、工程樹: 二、程式碼: CheckServlet.class import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; im
MVC實用構架設計(三)——EF-Code First(2):實體對映、資料遷移,重構
〇、目錄 一、前言 二、實體對映 實體關係圖實體類定義實體類對映三、資料遷移 四、程式碼重構 五、原始碼獲取 六、系列導航 一、前言 經過EF的《第一篇》,我們已經把資料訪問層基本搭建起來了,但並沒有涉及實體關係。實體關係對於一個數據庫系統來說至關重要,而且EF的各個實體之間的聯絡,實體之間的協
【PyQt5】(06)添加組件:按鈕,並設置位置和大小
github 輸出 技術 代碼 qt5 上傳 評論 教育版 www 特別說明 為了直接展示本篇的重點,往期內容將不再寫入代碼中,讀者可按需自行編碼組合 為了更好的展示效果,代碼段將以圖片的形式上傳,若想復制代碼可移步筆者的Github 為了便於學習,每篇只解決一個小問題,
【完全分散式Hadoop】(四)新建hadoop使用者以及使用者組,並賦予sudo免密碼許可權
搭建hadoop叢集環境不僅master和slaves安裝的hadoop路徑要完全一樣,也要求使用者和組也要完全一致。因此第一步就是新建使用者以及使用者組。對於新手來言,新建使用者使用者組,並賦予適當的許可權無疑是最大的問題。下面請跟隨我來新建使用者以及使用者組並賦予root許可權。
MVVM Light 新手入門(2) :ViewModel / Model 中定義屬性 ,並在View中呼叫 利刃 MVVMLight
今天學習MVVM架構中“屬性”的新增並呼叫,特記錄如下,學習資料均來自於網路,特別感謝翁智華的利刃 MVVMLight系列。 一個視窗的基本模型如下: View(檢視) -> ViewModel (檢視模型)-> 多個Model(模型) 注: 檢視是使用者在螢幕上看到
Spark專案之環境搭建(單機)五 配置eclipse的scala環境,並建立spark專案
先安裝scala 環境: eclipse版:spring-tool-suite-3.9.1.RELEASE-e4.7.1a-win32-x86_64 下載地址:https://www.scala-lang.org/download/ 然後配置環境變數,參考以下地址:
JS動態生成表單,並新增行雙擊事件
//獲取某一出庫型別某日期所有出庫單 累計金額列表function getOutSheetAmtList(){ var hosnum=$('#hosnum').val(); var sdate=$('#sdate').val();//記賬日期 始 var edate=$('#eda
利用mybatis generator外掛生成基於分頁語句及分頁解決方案
1》 雖然MyBatis_Generator可以將常用的DAO中的方法都生成,但是唯獨忽視了一點——分頁,雖然MyBatis支援分頁,但是那個分頁是記憶體分頁,如果資料量大的話記憶體恐怕要承受不了,於是就自動動手改造自動化工具生成的程式碼使其支援真分頁. 本文裡面我說的是
【Hibernate(二)】持久化類、主鍵生成策略和一級快取
1.2 持久化類的編寫規則 1.2.1 持久化類的概述 什麼是持久化類 持久化:將記憶體中的一個物件持久化到資料庫中過程。Hibernate框架就是用來進行持久化的框架。 持久化類:一個Java物件與資料庫的表建立了對映關係,那麼這個類在Hibernate中稱為是持久化類。
MFC/Qt下呼叫caffe原始碼(一)---將caffe原始碼生成動態連結庫dll
本人研一,最近想將用caffe訓出的模型,通過MFC做出一個介面,扔進一張圖片,點選預測,即可呼叫預測分類函式完成測試,並且通過MessageBox彈出最終分類的資訊。 首先通過查資料總結出兩種方法,第一:直接呼叫編譯好的caffe原始碼;(本次用到的原始碼是classif
Java永續性API(JPA)第7講——實體生命週期及生命週期回撥方法
em.createQuery("delete from Ordertable o where o.orderid = ?1").setParameter(1,orderid).executeUpdate();
持久化API(JPA)系列(七)實體關係對映(ORM)之單表對映@IdClass
通過以前的文章,我們瞭解到@Table、@Column、@Id實現了單表的對映,並且書劍有一個@Id指定的唯一欄位。有時我們的資料表也許是有多個主鍵聯合組成的,因此對於單表對映的主鍵,還可以進行如下兩種聯合主鍵對映。  
Hibernate (三)主鍵生成方式
參考文獻: http://blog.csdn.net/wanghuan203/article/details/7562395 http://www.cnblogs.com/hoobey/p/5508992.html 宣告:主鍵生成配置直接摘抄了http://www.cnbl
JS動態生成的元素,其對應的方法不響應(比如單擊事件,滑鼠移動事件等)
主要原因:在頁面給元素註冊點選事件的時候【 $(function () { XXX }); 】,JS動態生成的元素還尚未生成,所以click事件就沒有生效 解決方法: 方案一:js動態生成元素後再給其註冊事件 【註冊事件放在動態生成的js下面(js是從上往下執行的,當註冊事件的時候元素已經生成了
添加註解後,框架沒有自動根據實體類生成資料表,Hibernate
@Id註解:指定實體Bean的主鍵對映,需在getter方法上標註。@GeneratedValue註解:用於指定主鍵生成策略,註解支援的主鍵生成策略有: AUTO——相當於配置檔案中的native,根據底層資料庫自動選擇使用IDENTITY、SEQUENCE、TABLE型別(預設值)TABLE——使用ta
【SSH】——Hibernate(3)實體對映
實體對映技術作為類與表之間的聯絡紐帶,在ORM實現中起著至關重要的作用,對於我們而言,對映關係更多的體現在配置檔案的維護過程中。 ORM的實現思想就是將關係資料庫中表的資料對
Java 持久化技術規範(JPA )中的主鍵生成策略
簡介: Java Persistence API(JPA)中要求每個實體(Entity)類必須有一個主鍵,並且提供了 Table,Sequence,Identity,Auto 四種主鍵生成策略。其中 Identity 為表自動增長欄位;Sequence 通過序列產生主鍵;這兩