2017-04-06 3 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; 

は、私は、次の操作を実行したいプール:

myClassCriteriaは上から CriteriaQueryある
TypedQuery<MyClass > query = em.createQuery(myClassCriteria); 
query.setParameter("id", id); 
MyClass a = query.getSingleResult(); 
em.detach(a); 
return a; 

スレッドセーフなものですか?私は、queryの設定パラメータは、CriteriaQueryを内部的に変更して、それが踏み掛かりでないことを保証していると思われます。

私の疑惑は時々、アプリケーションがparameter 2 is not setというSQLエラーを投げたという状況から来たものです。私はクエリで1つのパラメータを持っているので、パラメータ2を知っていなくても、このような方法でパラメータ化されたクエリを再利用すると、スレッドセーフではないということになります。

エラーは要求に応じて再現不可能なため、原因を確認することは困難です。

私のJPAプロバイダはTypedQueryがパラメータ値ではなくCriteriaQueryを保持しているHiberate

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

答えて

0

です。これは、typedQueryの他のインスタンスと共有されてはいけません。私はスレッドセーフだと思う。 (名前付きクエリはスレッドセーフです)

idが常に満たされていることを確認してください。 これがこのエラーを引き起こす可能性がある唯一のクエリであるか、実行されている他のクエリ(2つのパラメータ付き)があるかどうかも確認します。

+0

これは私が思っていることですが、そうでないと思われます。おそらく、Hibernate idkのバグです。私は 'ThreadLocal 'を使用して以来、ランダムエラーはなくなりました。 – Antoniossss

関連する問題