我们在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,但没有成功
答案 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);
}
}