1. 程式人生 > >hibernate(jpa)根據實體動態生成查詢條件,並實現分頁問題的解決方案

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就不可能了。

相關推薦

hibernatejpa根據實體動態生成查詢條件實現問題的解決方案

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 First2實體對映、資料遷移重構

〇、目錄 一、前言 二、實體對映 實體關係圖實體類定義實體類對映三、資料遷移 四、程式碼重構 五、原始碼獲取 六、系列導航 一、前言   經過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永續性APIJPA第7講——實體生命週期及生命週期回撥方法

em.createQuery("delete from Ordertable o where o.orderid = ?1").setParameter(1,orderid).executeUpdate();

持久化APIJPA系列(七)實體關係對映(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】——Hibernate3實體對映

      實體對映技術作為類與表之間的聯絡紐帶,在ORM實現中起著至關重要的作用,對於我們而言,對映關係更多的體現在配置檔案的維護過程中。       ORM的實現思想就是將關係資料庫中表的資料對

Java 持久化技術規範JPA 中的主鍵生成策略

簡介: Java Persistence API(JPA)中要求每個實體(Entity)類必須有一個主鍵,並且提供了 Table,Sequence,Identity,Auto 四種主鍵生成策略。其中 Identity 為表自動增長欄位;Sequence 通過序列產生主鍵;這兩