2017-05-06 21 views
0

我正在研究一個經常使用CriteriaBuilder.CoalesceRoot的大代碼庫。例如,設置CriteriaBuilder

criteriaBuilder.coalesce(root.get('adjustedWeight'), root.get('weight'))

我不明白這句法。舉例來說,Coalesce API似乎只接受1個類型爲Expression<? extends T>T的參數。我也不明白根是什麼或爲什麼它是有用的。

爲了幫助我理解,我使用CriteriaBuilder和Root創建了一個使用上面代碼行的簡化示例。我成功地連接了Hibernate和JPA。

請記住我有3天的Java編程經驗。我的家鄉是langugage C#

import models.MyEntity; 
import org.hibernate.jpa.HibernatePersistenceProvider; 

import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.spi.PersistenceProvider; 
import java.util.HashMap; 
import java.util.List; 


public class Main { 
    public static final String SELECT_QUERY = "from MyEntity where title = :title"; 

    public static void main(String[] args) { 
      String title = "secureexam"; 
      PersistenceProvider persistenceProvider = new HibernatePersistenceProvider(); 
      EntityManagerFactory entityManagerFactory = persistenceProvider 
        .createEntityManagerFactory("NewPersistenceUnit", new HashMap()); 
      EntityManager entityManager = entityManagerFactory.createEntityManager(); 
      List<MyEntity> result = entityManager 
        .createQuery(SELECT_QUERY, MyEntity.class) 
        .setParameter("title", title) 
        .getResultList(); 

      System.out.println("result is " + result.get(0).getTitle()); 
      entityManager.close(); 
    } 
} 

能否請您解釋的第一行代碼給我關於criteriaBuilder?另外,如何修改我的代碼以使用這一行代碼?

UPDATE

凱文·彼得斯的回答中提到的文章稍作修改工作:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); 
    CriteriaQuery<Entity> criteriaQuery = criteriaBuilder.createQuery(Entity.class); 

//Test 1 
Root<AssessmentEntity> rootTest1 = criteriaQuery.from(Entity.class); 

換句話說,CriteriaBuilderCriteriaQuery必須以不同的方式實例化的構建工作。例如。整個CriteriaQuery<Entity class>語法對我來說沒有意義。

回答

1

看來你有錯誤的API文檔,正確的是this。 coalesce方法(如SQL pendant)只是返回第一個非空值,因此如果不爲空,則返回adjustedWeight的值,否則返回weight的值,或者如果不存在任何值,則返回至少爲null。

您的案例中的root變量僅代表您正在處理的表,它們分別表示查詢的根(SQL查詢翻譯將爲... FROM ...)。這個名字是任意的。 As database term this would be the selectionThis article也可以幫助你。