找不到查询异常的实体

时间:2011-01-31 08:09:47

标签: java jpa jboss ejb

我正在执行以下行:

  String queString = "some query string"
  Query q1 = em.createNativeQuery(queString, T03CallsLog.class);
  T03CallsLog newCall;
  newCall = (T03CallsLog) q1.getSingleResult(); //this line cause the exception after         the first time
奇怪的情况。 如果我只使用一个实例执行它就可以正常工作,但是如果我与多个实例(mdb)并行执行它,那么第一个实例将被执行而没有任何异常,所有其他实例都会收到此错误:

10:04:50,750 ERROR [log] ECMSDispatcherMdb.onMessage, error: No entity found for query

任何想法可能导致什么?以及它是如何在第一次工作,但对于所有其他实例它不是吗?

感谢,

射线。

3 个答案:

答案 0 :(得分:51)

错误消息通常告诉您,查询未返回任何结果。所以getSingleResult()失败了。

如果您希望查询空查询结果,请考虑使用getResultList()并使用isEmpty()测试结果:

T03CallsLog newCall = null;
List results = q1.getResultList();
if (!results.isEmpty())
   newCall = (T03CallsLog) results.get(0);
else
   // is it a problem? -> log.

答案 1 :(得分:7)

如果查询未返回任何结果,则getSingleResult()会抛出NoResultException。您确定,秒MDB会通过您的查询获得任何结果吗?

答案 2 :(得分:0)

休眠

hibernate中更具体的entityManager是HibernateEntityManager。如果你不是

@PersistenceContext
public final EntityManager em = null;

使用更具体的

@PersistenceContext
public final HibernateEntityManager em = null;

然后你可以使用

String queString = "some query string"
Iterator<T03CallsLog> q1 = em.createNativeQuery(queString, T03CallsLog.class).iterate();
T03CallsLog newCall = q1.hasNext() ? q1.next() : null;