2017-04-06 80 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

相关问题