NoResultException:getSingleResult()没有检索任何实体。 QueryImpl.throwNoResultException

时间:2017-12-22 09:38:37

标签: jpa

我们在payara 164应用服务器中部署了一个java Web应用程序 主机是debian 9.3服务器,用过的数据库是mariadb-server-10.1,java版本是“1.8.0_131”。

最近我们面临一些问题,其中一个问题如下。它只是一个实例,因为它与许多其他对象随机发生,即使它们确实不是NULL但是正确填充。

  

dmlm.models.entities.User.getCustomer(User.java:337)中的javax.ejb.EJBTransactionRolledbackException   引起:javax.persistence.NoResultException:getSingleResult()没有检索任何实体。

编辑:

在几个地方被称为以下方法:

public Customer getCustomerByUser(User user)
{
    TypedQuery<Customer> q = em.createNamedQuery("Customer.findByUser", Customer.class);
    q.setParameter("userId", user.getId());
    if (LOG.isLoggable(Level.FINER)) {
        //<editor-fold defaultstate="collapsed" desc="per stampare nei log una query runtime">
        org.eclipse.persistence.sessions.Session session
                = em.unwrap(JpaEntityManager.class).getActiveSession();
        DatabaseQuery databaseQuery = ((EJBQueryImpl) q).getDatabaseQuery();
        databaseQuery.prepareCall(session, new DatabaseRecord());
        DatabaseRecord recordWithValues = new DatabaseRecord();
        recordWithValues.add(new DatabaseField("userId"), user.getId());

        String sqlStringWithArgs
                = databaseQuery.getTranslatedSQLString(session, recordWithValues);
        LOG.finest(sqlStringWithArgs);
        //</editor-fold>
    }
    return q.getSingleResult();
}

日志部分只是打印出使用参数

创建的真实查询

命名查询:

@NamedQuery(name = "Customer.findByUser",
            query = "SELECT m FROM Customer m JOIN m.users us WHERE m.deleted = false AND us.id = :userId")

如上所述,结果应该是客户ID

的单一结果

编辑2: 我们试图将数据库从maria-db更改为mysql,但没有成功

1 个答案:

答案 0 :(得分:2)

只有在您100%确定数据库中存在特定记录(唯一)时,才应使用getSingleResult()。抛出的异常是运行时。运行时异常=程序员问题。

如果您不知道记录是否唯一存在,则可以使用此构造。

public Entity getEntityByName(String name) {
    TypedQuery<Entity> query = em.createNamedQuery(Entity.GET_ENTITY_BY_NAME, Entity.class);
    query.setParameter(Entity.PRM_NAME, name);
    List<Project> found = query.getResultList();

    if (found.isEmpty()) {
        return null; //or throw checked exception data not found
    } else {
        return found.get(0);
    }

}