Hibernate Group-透過使用 Criteria API
瀏覽人數:217最近更新:
1. 概述
Hibernate 是一個強大的 ORM 框架,它使我們能夠減少對 SQL 的關注,而更專注於 Java 物件的使用。 Criteria API 提供了一種建立資料庫查詢的程式設計方式,在查詢動態且複雜時特別有用。
在本文中,我們將探討如何使用 Hibernate 的 Criteria API 來執行分組操作。
2. 建立模型
讓我們建立一個帶有category
和price
欄位的基本Product
實體。我們的目標是按category
對產品進行分組並計算每個category
總price
:
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String category;
private Double price;
// Getters and setters omitted for brevity
}
3. 使用 Criteria API 對產品進行分組
Criteria API 提供了一種執行複雜查詢(包括分組操作)的程式設計方式。
讓我們建立一個按category
對產品進行分組併計算每個category
的總price
的方法:
public class ProductService {
private SessionFactory sessionFactory;
public ProductService() {
sessionFactory = new Configuration().configure().buildSessionFactory();
}
public List<Object[]> getTotalPricePerCategory() {
try (Session session = sessionFactory.openSession()) {
CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
CriteriaQuery<Object[]> query = criteriaBuilder.createQuery(Object[].class);
Root<Product> root = query.from(Product.class);
query.multiselect(
root.get("category"),
criteriaBuilder.sum(root.get("price"))
).groupBy(root.get("category"));
return session.createQuery(query).getResultList();
}
}
}
讓我們深入研究一下我們在這個例子中所做的事情的細節:
- 我們使用
CriteriaQuery
介面的groupBy()
方法按category
欄位對產品進行分組。 - 然後,我們使用
criteriaBuilder.sum()
方法計算每個category
總price
。 - 程式碼以
Object[]
列表的形式傳回結果,其中每個陣列包含category
和總價。
我們也可以看看產生的 SQL:
select
p.category c,
sum(p.price) s
from
product p
group by
c
請注意,這裡我們使用了 try-with-resources,因此我們不必擔心手動關閉Session
。
4. 單元測試
現在,讓我們新增一個單元測試來驗證我們的分組查詢:
@BeforeAll
public void setup() {
productService = new ProductService();
// Insert sample data
try (Session session = productService.getSessionFactory().openSession()) {
session.beginTransaction();
Product product1 = new Product("Product1", "Electronics", 100.0);
Product product2 = new Product("Product2", "Electronics", 150.0);
Product product3 = new Product("Product3", "Furniture", 200.0);
session.persist(product1);
session.persist(product2);
session.persist(product3);
session.getTransaction().commit();
}
}
@Test
public void whenGroupedByCategory_thenReturnTotalPrice() {
List<Object[]> results = productService.getTotalPricePerCategory();
Assertions.assertEquals(2, results.size());
results.forEach(record -> {
String category = (String) record[0];
Double totalPrice = (Double) record[1];
if ("Electronics".equals(category)) {
Assertions.assertEquals(250.0, totalPrice);
} else if ("Furniture".equals(category)) {
Assertions.assertEquals(200.0, totalPrice);
}
});
}
這是我們在本次測試中所做的事情:
- 我們使用設定方法將範例資料插入資料庫。
- 然後,我們呼叫
getTotalPricePerCategory()
方法並透過檢查每個category
的總price
是否正確來驗證結果。
5. 結論
在本文中,我們了解如何使用 Hibernate Criteria API 執行分組查詢,該 API 提供了類型安全的程式查詢方法。
本教學的範例程式碼可以 在 GitHub 上找到。
本作品係原創或者翻譯,採用《署名-非商業性使用-禁止演繹4.0國際》許可協議