簡體   English   中英

在Hibernate 5中,CriteriaQuery相當於Criteria的限制和預測是什么?

[英]In Hibernate 5, what's the CriteriaQuery equivalent of Criteria's restriction and projection?

在Hibernate 5棄用Criteria類之前,您可以向Criteria添加限制以充當約束,並將投影添加為select語句,如此

Criteria criteria = session.createCriteria(T.class)
    .add(Restrictions.or(Restrictions.eq(property, constraintValue)
    .set(Projection(Projections.projectionList()
    .add(Projections.property(selectValue)));

但是,既然你現在需要像這樣使用CriteriaQuery,

 CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
 CriteriaQuery<T> criteriaQuery = criteriaBuilder.createQuery(T.class);
 Root<T> root = criteriaQuery.from(T.class);
 criteriaQuery.select(root);

 Query<T> query = session.createQuery(criteriaQuery);

但是我一直無法弄清楚如何添加SQL語句中所需的某些東西,主要是因為搜索文檔往往會因為命名相似性而最終出現關於Criteria的文檔。

那么,如何使用CriteriaQuery重新創建一個簡單的查詢,如下所示呢?

SELECT selectValue  
FROM tables.T  
WHERE property = constraintValue

資源。

有多個示例,但事實證明我們嘗試重新創建的簡單select語句可以像這樣完成:

CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
CriteriaQuery<SELECTVALUETYPE> criteriaQuery = criteriaBuilder.createQuery(SELECTVALUETYPE.class);
Root<PARENTCLASS> root = criteriaQuery.from(PARENTCLASS.class);
criteriaQuery.select(root);
criteriaQuery.where(criteriaBuilder.equal(root.get(property), constraintValue));

Query<SELECTVALUETYPE> query = session.createQuery(criteriaQuery);

請注意,這是一個通用答案,實際上不會運行。 原因是,SELECTVALUETYPE需要替換為selectValue的數據類型。
例如,CriteriaQuery可能會變為:

  • String selectValue - > CriteriaQuery
  • T selectValue - > CriteriaQuery

因此,該聲明的工作示例

Select name  
From Users  
Where ID = 1

可以用以下塊表示

int ID = 1;
CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
CriteriaQuery<String> criteriaQuery = criteriaBuilder.createQuery(String.class);
Root<User> root = criteriaQuery.from(User.class);
criteriaQuery.select(root.get("name");
criteriaQuery.where(criteriaBuilder.equal(root.get("ID"), ID));

Query<String> query = session.createQuery(criteriaQuery);

List<String>results = query.getResultList();
for(String name : results){
    System.out.println("Name: " + name);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM