2017-04-06 83 views
1

我想有可重複使用的CriteriaQuery與此類似:帶參數線程安全的JPA2 CriteriaQuery是否可以創建查詢?

CriteriaBuilder b = cb(); 
    CriteriaQuery<MyClass> query = b.createQuery(MyClass.class); 
    Root<MyClass> myClass= query.from(MyClass.class); 
    where.add(b.equal(applicant.get(MyClass_.id),   b.parameter(Integer.class, "id"))); 
    query.where(where.toArray(new Predicate[where.size()])); 
    return query; 

現在工作線程池我想執行以下操作:

TypedQuery<MyClass > query = em.createQuery(myClassCriteria); 
query.setParameter("id", id); 
MyClass a = query.getSingleResult(); 
em.detach(a); 
return a; 

其中myClassCriteriaCriteriaQuery從上面。

是一個線程安全apporach?我懷疑,query上的設置參數可以在內部修改給定的CriteriaQuery,使其不具有胎面安全性。

我的懷疑來自偶爾應用程序拋出一些SQL錯誤說parameter 2 is not set的情況。我什至不知道什麼參數2這裏是因爲我只有1 paremeter在查詢中,但這使得我的事情,以這種方式restruct parametrized查詢可以是非線程安全的。

錯誤不能按需重現,所以很難確定原因。

我的JPA提供者是Hiberate

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-core</artifactId> 
    <version>5.2.1.Final</version> 
</dependency> 

回答

0

TypedQuery持有的參數值,而不是CriteriaQuery中。它不應該與其他typedQuery實例共享。我認爲這是線程安全的。 (如命名查詢是線程安全的)

檢查id是否始終被填充。 同時檢查這是否是唯一可能導致此錯誤的查詢,或者是否有其他查詢(帶有兩個參數)正在執行。

+0

這就是我的想法,但它看起來不然 - 也許是Hibernate idk中的一個錯誤。隨機錯誤消失了,因爲我使用了'ThreadLocal '。 – Antoniossss

相關問題