私はこれに似た再利用可能な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>
これは私が思っていることですが、そうでないと思われます。おそらく、Hibernate idkのバグです。私は 'ThreadLocal 'を使用して以来、ランダムエラーはなくなりました。 –
Antoniossss