<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Hiberate 條件查詢示例 > 原文: [https://howtodoinjava.com/hibernate/hibernate-criteria-queries-tutorial/](https://howtodoinjava.com/hibernate/hibernate-criteria-queries-tutorial/) [Hiberate](https://howtodoinjava.com/hibernate-tutorials/) 提供了三種不同的方法來從數據庫檢索數據。 我們已經討論過 [**HQL 和本機 SQL 查詢**](//howtodoinjava.com/hibernate/complete-hibernate-query-language-hql-tutorial/ "Complete Hibernate Query Language [HQL] Tutorial")。 現在,我們將討論我們的第三個選項,即 **Hiberate 條件查詢**。 使用條件查詢 API,您可以使用 Java 構建嵌套的結構化查詢表達式,從而提供了 HQL 或 SQL 等查詢語言無法進行的編譯時語法檢查。 條件 API 還包括示例查詢(QBE)功能。 這樣,您就可以提供示例對象,這些對象包含要檢索的屬性,而不必逐步說明查詢的組件。 它還包括包括`count()`的投影和聚合方法。 讓我們詳細探討它的不同功能。 ```java Table of Contents 1\. Hibernate criteria example 2\. Hibernate criteria - using Restrictions 3\. Hibernate criteria - paging through the result set 4\. Hibernate criteria - Obtain unique result 5\. Hibernate criteria - obtaining distinct results 6\. Hibernate criteria - sort query results 7\. Hibernate criteria - perform associations (joins) 8\. Hibernate criteria - add projections 9\. Hibernate criteria - query by example (QBE) 10\. Summary ``` ## 1\. Hiberate 條件示例 條件 API 允許您以編程方式構建條件查詢對象; `org.hibernate.Criteria`接口定義這些對象之一的可用方法。 Hiberate `Session`接口包含幾種重載的`createCriteria()`方法。 將持久化對象的類或其實體名稱傳遞給`createCriteria()`方法,然后 hibernate 將創建一個`Criteria`對象,當您的應用執行條件查詢時,該對象將返回持久化對象的類的實例。 條件查詢的最簡單示例是沒有可選參數或限制的條件查詢 - 條件查詢將僅返回與該類相對應的每個對象。 ```java Criteria crit = session.createCriteria(Product.class); List<Product> results = crit.list(); ``` 從這個簡單的條件示例繼續,我們將向我們的條件查詢添加約束,以便我們可以縮減結果集。 ## 2\. Hiberate 條件 – 使用限制 使用條件 API,您可以輕松地在查詢中使用限制來有選擇地檢索對象。 例如,您的應用只能檢索價格超過 30 美元的產品。 您可以使用`add()`方法將這些限制添加到`Criteria`對象。 `add()`方法采用代表單個限制的`org.hibernate.criterion.Criterion`對象。 一個條件查詢可以有多個限制。 #### 2.1 `Restrictions.eq()`示例 要檢索屬性值“**等于**”你的限制的對象,請使用`Restrictions`上的`eq()`方法,如下所示: ```java Criteria crit = session.createCriteria(Product.class); crit.add(Restrictions.eq("description","Mouse")); List<Product> results = crit.list() ``` 上面的查詢將搜索所有描述為“`Mouse`”的產品。 #### 2.2 `Restrictions.ne()`示例 要檢索具有屬性值“不等于”你的限制的對象,請使用`Restrictions`上的`ne()`方法,如下所示: ```java Criteria crit = session.createCriteria(Product.class); crit.add(Restrictions.ne("description","Mouse")); List<Product> results = crit.list() ``` 上面的查詢將搜索所有具有描述的產品,但不包含“`Mouse`”。 您不能使用不相等的限制來檢索該屬性在數據庫中具有`NULL`值的記錄(在 SQL 中,因此在 Hibernate 中,`NULL`表示缺少數據,因此無法與數據進行比較)。 如果需要檢索具有`NULL`屬性的對象,則必須使用`isNull()`限制。 #### 2.3 `Restrictions.like()`和`Restrictions.ilike()`示例 除了搜索完全匹配之外,我們還可以檢索具有與給定模式的一部分屬性匹配的所有對象。 為此,我們需要使用`like()`或`ilike()`方法創建一個 SQL `LIKE`子句。 `ilike()`方法不區分大小寫。 ```java Criteria crit = session.createCriteria(Product.class); crit.add(Restrictions.like("name","Mou%",MatchMode.ANYWHERE)); List<Product> results = crit.list(); ``` 上面的示例使用`org.hibernate.criterion.MatchMode`對象指定如何將指定的值與存儲的數據進行匹配。 `MatchMode`對象(類型安全的枚舉)具有四個不同的匹配項: + `ANYWHERE`:字符串的任意位置 + `END`:字符串的末尾 + `EXACT`:完全匹配 + `START`:字符串的開頭 #### 2.4 `Restrictions.isNull()`和`Restrictions.isNotNull()`示例 `isNull()`和`isNotNull()`限制使您可以搜索具有(或不具有)空屬性值的對象。 ```java Criteria crit = session.createCriteria(Product.class); crit.add(Restrictions.isNull("name")); List<Product> results = crit.list(); ``` #### 2.5 `Restrictions.gt()`,`Restrictions.ge()`,`Restrictions.lt()`和`Restrictions.le()`示例 一些限制對于進行數學比較很有用。 大于比較為`gt()`,大于或等于比較為`ge()`,小于比較為`lt()`,小于或等于比較為`le()`。 我們可以使用 Java 的類型提升來快速檢索價格超過 25 美元的所有此類產品,以轉換為`Double`: ```java Criteria crit = session.createCriteria(Product.class); crit.add(Restrictions.gt("price", 25.0)); List<Product> results = crit.list(); ``` #### 2.6 結合兩個或更多個條件示例 繼續,我們可以開始使用條件 API 進行更復雜的查詢。 例如,我們可以在邏輯表達式中組合 AND 和 OR 限制。 當我們向條件查詢添加多個約束時,它將被解釋為 AND,如下所示: ```java Criteria crit = session.createCriteria(Product.class); crit.add(Restrictions.lt("price",10.0)); crit.add(Restrictions.ilike("description","mouse", MatchMode.ANYWHERE)); List<Product> results = crit.list(); ``` 如果我們希望有兩個限制來返回滿足兩個或兩個限制的對象,則需要在`Restrictions`類上使用`or()`方法,如下所示: ```java Criteria crit = session.createCriteria(Product.class); Criterion priceLessThan = Restrictions.lt("price", 10.0); Criterion mouse = Restrictions.ilike("description", "mouse", MatchMode.ANYWHERE); LogicalExpression orExp = Restrictions.or(priceLessThan, mouse); crit.add(orExp); List results=crit.list(); ``` 我們在此處創建的`orExp`邏輯表達式將被視為任何其他條件。 因此,我們可以對條件添加另一個限制: ```java Criteria crit = session.createCriteria(Product.class); Criterion price = Restrictions.gt("price",new Double(25.0)); Criterion name = Restrictions.like("name","Mou%"); LogicalExpression orExp = Restrictions.or(price,name); crit.add(orExp); crit.add(Restrictions.ilike("description","blocks%")); List results = crit.list(); ``` #### 2.7 將析取對象與條件一起使用 如果我們要創建一個具有兩個以上不同條件的 OR 表達式(例如,“`price > 25.0 OR name like Mou% OR description not like blocks%`”),則可以使用`org.hibernate.criterion.Disjunction`對象來表示析取。 您可以從`Restrictions`類的`disjunction()`工廠方法獲取此對象。 分離比在代碼中構建 OR 表達式樹更方便。 要表示具有兩個以上條件的 AND 表達式,可以使用`conjunction()`方法,盡管可以輕松地將它們添加到`Criteria`對象中。 與在代碼中構建 AND 表達式樹相比,該連接更方便。 這是一個使用析取的示例: ```java Criteria crit = session.createCriteria(Product.class); Criterion priceLessThan = Restrictions.lt("price", 10.0); Criterion mouse = Restrictions.ilike("description", "mouse", MatchMode.ANYWHERE); Criterion browser = Restrictions.ilike("description", "browser", MatchMode.ANYWHERE); Disjunction disjunction = Restrictions.disjunction(); disjunction.add(priceLessThan); disjunction.add(mouse); disjunction.add(browser); crit.add(disjunction); List results = crit.list(); ``` #### 2.8 `Restrictions.sqlRestriction()`示例 `sqlRestriction()`限制使您可以在條件 API 中直接指定 SQL。 如果您需要使用 Hibernate 通過條件 API 不支持的 SQL 子句,這將非常有用。 您的應用代碼無需知道您的類使用的表的名稱。 使用`{alias}`來表示類的表,如下所示: ```java Criteria crit = session.createCriteria(Product.class); crit.add(Restrictions.sqlRestriction("{alias}.description like 'Mou%'")); List<Product> results = crit.list(); ``` ## 3\. Hiberate 條件 – 對結果集分頁 條件可以解決的一種常見應用模式是通過數據庫查詢的結果集進行分頁。 與查詢一樣,`Criteria`接口上有兩種分頁方法:`setFirstResult()`和`setMaxResults()`。 `setFirstResult()`方法采用一個代表結果集中第一行的整數,從第 0 行開始。您可以使用`setMaxResults()`方法告訴 Hibernate 檢索固定數量的對象。 結合使用這兩者,我們可以在 Web 或 Swing 應用中構造一個分頁組件。 ```java Criteria crit = session.createCriteria(Product.class); crit.setFirstResult(1); crit.setMaxResults(20); List<Product> results = crit.list(); ``` 如您所見,這使得分頁結果集變得容易。 您可以增加返回的第一個結果(例如,從 1 到 21,再到 41 等)以翻頁結果集。 ## 4\. Hiberate 條件 – 獲得獨特的結果 有時您知道您將從給定查詢中僅返回零或一個對象。 這可能是因為您正在計算匯總,或者是因為您的限制自然會導致唯一的結果。 如果要獲取單個`Object`引用而不是`List`,則`Criteria`對象上的`uniqueResult()`方法將返回一個對象或`null`。 如果結果不止一個,則`uniqueResult()`方法將拋出`HibernateException`。 以下簡短示例演示了一個結果集,該結果集將包含多個結果,但該結果集受`setMaxResults()`方法限制: ```java Criteria crit = session.createCriteria(Product.class); Criterion price = Restrictions.gt("price",new Double(25.0)); crit.setMaxResults(1); Product product = (Product) crit.uniqueResult(); ``` 同樣,請注意,如果使用`uniqueResult()`方法,則需要確保查詢僅返回一或零個結果。 否則,Hibernate 將拋出`NonUniqueResultException`異常。 ## 5\. Hiberate 條件 – 獲得不同的結果 如果您想使用條件查詢的不同結果,則 Hibernate 提供了針對不同實體的結果轉換器`org.hibernate.transform.DistinctRootEntityResultTransformer`,以確保查詢的結果集中不會出現重復項。 **不同于使用 SQL 的`SELECT DISTINCT`,不同的結果轉換器使用其默認的`hashCode()`方法比較每個結果,并且僅將具有唯一哈希碼的結果添加到結果集中**。 這可能是或可能不是您期望從其他等效的 SQL DISTINCT 查詢中得到的結果,因此**對此**要小心。 ```java Criteria crit = session.createCriteria(Product.class); Criterion price = Restrictions.gt("price",new Double(25.0)); crit.setResultTransformer( DistinctRootEntityResultTransformer.INSTANCE ) List<Product> results = crit.list(); ``` 另一個性能說明:比較是在 Hibernate 的 Java 代碼中完成的,而不是在數據庫中完成的,因此非唯一的結果仍將通過網絡傳輸。 ## 6\. Hiberate 條件 – 對查詢結果進行排序 使用條件對查詢結果進行排序的方式與使用 HQL 或 SQL 進行排序的方式幾乎相同。 條件 API 提供了`org.hibernate.criterion.Order`類,可以根據對象的屬性之一將結果集按升序或降序排序。 此示例演示如何使用`Order`類: ```java Criteria crit = session.createCriteria(Product.class); crit.add(Restrictions.gt("price",10.0)); crit.addOrder(Order.desc("price")); List<Product> results = crit.list(); ``` 您可以向`Criteria`對象添加多個`Order`對象。 Hibernate 會將它們傳遞給基礎 SQL 查詢。 您的結果將按第一順序排序,然后第一排序中的所有相同匹配項將按第二順序排序,依此類推。 在幕后, **Hibernate 在將屬性**替換為適當的數據庫列名稱之后,將其傳遞給 SQL `ORDER BY`子句。 ## 7\. Hiberate 條件 – 執行關聯(連接) 從**一對多**或從多對一連接時,關聯有效。 首先,我們將演示如何使用一對多關聯來獲取價格超過 25 美元的供應商。 請注意,我們為產品屬性創建了一個新的`Criteria`對象,為我們剛剛創建的產品條件添加了限制,然后從供應商`Criteria`對象獲取結果: ```java Criteria crit = session.createCriteria(Supplier.class); Criteria prdCrit = crit.createCriteria("products"); prdCrit.add(Restrictions.gt("price",25.0)); List results = crit.list(); ``` 換句話說,我們使用多對一關聯從供應商 MegaInc 獲取所有產品: ```java Criteria crit = session.createCriteria(Product.class); Criteria suppCrit = crit.createCriteria("supplier"); suppCrit.add(Restrictions.eq("name","Hardware Are We")); List results = crit.list(); ``` ## 8\. Hiberate 條件 – 添加預測和匯總 您可以將結果集中的結果視為一組行和列,也稱為數據投影,而不是使用結果集中的對象。 這類似于您將通過 JDBC 使用`SELECT`查詢中的數據的方式類似。 要使用投影,請從`org.hibernate.criterion.Projections`工廠類中獲取所需的`org.hibernate.criterion.Projection`對象。 `Projections`類與`Restrictions`類相似,因為它提供了幾種用于獲取`Projection`實例的靜態工廠方法。 獲得`Projection`對象后,使用`setProjection()`方法將其添加到`Criteria`對象中。 執行`Criteria`對象時,該列表包含可以轉換為適當類型的對象引用。 #### 8.1 單個聚合(獲取行數) ```java Criteria crit = session.createCriteria(Product.class); crit.setProjection(Projections.rowCount()); List<Long> results = crit.list(); ``` 通過`Projections`工廠類可用的其他聚合函數包括: 1. **`avg(String propertyName)`**:給出屬性值的平均值 2. **`count(String propertyName)`**:計算屬性發生的次數 3. **`countDistinct(String propertyName)`**:計算屬性包含的唯一值的數量 4. **`max(String propertyName)`**:計算屬性值的最大值 5. **`min(String propertyName)`**:計算屬性值的最小值 6. **`sum(String propertyName)`**:計算屬性值的總和 #### 8.2 多個集合 我們可以將多個投影應用于給定的`Criteria`對象。 若要添加多個投影,請從`Projections`類的`projectionList()`方法中獲取一個投影列表。 `org.hibernate.criterion.ProjectionList`對象具有采用`Projection`對象的`add()`方法。 您可以將投影列表傳遞給`Criteria`對象上的`setProjection()`方法,因為`ProjectionList`實現了`Projection`接口。 ```java Criteria crit = session.createCriteria(Product.class); ProjectionList projList = Projections.projectionList(); projList.add(Projections.max("price")); projList.add(Projections.min("price")); projList.add(Projections.avg("price")); projList.add(Projections.countDistinct("description")); crit.setProjection(projList); List<object[]> results = crit.list(); ``` #### 8.3 獲取選定列 投影的另一個用途是檢索單個屬性,而不是實體。 例如,我們可以僅從產品表中檢索名稱和描述,而不是將整個對象表示加載到內存中。 ```java Criteria crit = session.createCriteria(Product.class); ProjectionList projList = Projections.projectionList(); projList.add(Projections.property("name")); projList.add(Projections.property("description")); crit.setProjection(projList); crit.addOrder(Order.asc("price")); List<object[]> results = crit.list(); ``` ## 9\. Hiberate 條件 – 示例查詢(QBE) 在 QBE 中,您可以部分填充該對象的實例,而不必以編程方式使用`Criterion`對象和邏輯表達式構建`Criteria`對象。 您可以將此實例用作模板,并讓 Hibernate 根據其值為您構建條件。 這可以使您的代碼保持整潔,并使您的項目更易于測試。 例如,如果我們有一個用戶數據庫,則可以構造一個用戶對象的實例,設置類型和創建日期的屬性值,然后使用條件 API 運行 QBE 查詢。 Hibernate 將返回一個結果集,其中包含與設置的屬性值匹配的所有用戶對象。 在后臺,Hibernate 檢查`Example`對象,并構造一個與`Example`對象的屬性相對應的 SQL 片段。 下面的基本示例搜索與示例`Supplier`對象上的名稱匹配的供應商: ```java Criteria crit = session.createCriteria(Supplier.class); Supplier supplier = new Supplier(); supplier.setName("MegaInc"); crit.add(Example.create(supplier)); List results = crit.list(); ``` ## 10\. 總結 使用條件 API 是開始使用 HQL 開發的絕佳方法。 Hibernate 的開發人員提供了一個干凈的 API,用于為使用 Java 對象的查詢添加限制。 盡管 HQL 不太難學,但是一些開發人員更喜歡條件查詢 API,因為它提供了編譯時語法檢查,盡管直到運行時才能檢查列名和其他與模式相關的信息。 學習愉快! 閱讀更多: [Hiberate 文檔](https://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#criteria)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看