【问题标题】:javax.persistence.NoResultException: No entity found for query JPQL Queryjavax.persistence.NoResultException:没有找到查询JPQL查询的实体
【发布时间】:2014-10-26 07:18:35
【问题描述】:
@Entity
@Table(name = "ways", schema = "public", uniqueConstraints = @UniqueConstraint(columnNames = "gid"))
public class Ways implements java.io.Serializable {
private WaysId id;

public Ways() {
}

public Ways(WaysId id) {
    this.id = id;
}

@EmbeddedId
@AttributeOverrides({
        @AttributeOverride(name = "gid", column = @Column(name = "gid", unique = true)),
        @AttributeOverride(name = "classId", column = @Column(name = "class_id", nullable = false)),
        @AttributeOverride(name = "length", column = @Column(name = "length", precision = 17, scale = 17)),
        @AttributeOverride(name = "name", column = @Column(name = "name")),
        @AttributeOverride(name = "x1", column = @Column(name = "x1", precision = 17, scale = 17)),
        @AttributeOverride(name = "y1", column = @Column(name = "y1", precision = 17, scale = 17)),
        @AttributeOverride(name = "x2", column = @Column(name = "x2", precision = 17, scale = 17)),
        @AttributeOverride(name = "y2", column = @Column(name = "y2", precision = 17, scale = 17)),
        @AttributeOverride(name = "reverseCost", column = @Column(name = "reverse_cost", precision = 17, scale = 17)),
        @AttributeOverride(name = "rule", column = @Column(name = "rule")),
        @AttributeOverride(name = "toCost", column = @Column(name = "to_cost", precision = 17, scale = 17)),
        @AttributeOverride(name = "maxspeedForward", column = @Column(name = "maxspeed_forward")),
        @AttributeOverride(name = "maxspeedBackward", column = @Column(name = "maxspeed_backward")),
        @AttributeOverride(name = "osmId", column = @Column(name = "osm_id")),
        @AttributeOverride(name = "priority", column = @Column(name = "priority", precision = 17, scale = 17)),
        @AttributeOverride(name = "theGeom", column = @Column(name = "the_geom")),
        @AttributeOverride(name = "source", column = @Column(name = "source")),
        @AttributeOverride(name = "target", column = @Column(name = "target"))})
        //@AttributeOverride(name = "vitesse", column = @Column(name = "vitesse", precision = 17, scale = 17))})
public WaysId getId() {
    return this.id;
}

public void setId(WaysId id) {
    this.id = id;
}

}
@Embeddable
public class WaysId implements java.io.Serializable {

private Integer gid;
private int classId;
private Double length;
private String name;
private Double x1;
private Double y1;
private Double x2;
private Double y2;
private Double reverseCost;
private String rule;
private Double toCost;
private Integer maxspeedForward;
private Integer maxspeedBackward;
private Long osmId;
private Double priority;
private Serializable theGeom;
private Integer source;
private Integer target;
}



public double convertidTolat1(Integer id) {
    Double lat = null;
    Query query = entityManager
            .createQuery("select n.id.x1 from Ways n where n.id.gid=:id");
    query.setParameter("id", id);
    lat = (Double) query.getSingleResult();
    return lat;
}


@GET
@Path("lat/{id}")
@Produces(MediaType.APPLICATION_JSON)
public BigDecimal getlat(@PathParam(value = "id") long id) {
    BigDecimal d = iservices.getLat(id);
    return d;
}

大家好,这是我的代码,我想知道我的查询有什么问题?

【问题讨论】:

    标签: postgresql rest jakarta-ee jpa jboss


    【解决方案1】:

    您的查询没有问题。 Embeddables 的路径表达式在 JPA 中完全有效。你只是没有得到任何结果。 NoResultException 的 Javadoc 非常具有描述性。

    在查询上执行 Query.getSingleResult() 或 TypedQuery.getSingleResult() 并且没有返回结果时由持久性提供程序抛出。此异常不会导致当前事务(如果处于活动状态)被标记为回滚。

    我建议将 getSingleResult() 包装在 try-catch 块中以处理无结果的情况

    Object result = null;
    try {
        result = query.getSingleResult();
    } catch (NoResultException e) {
        log.debug("No result forund for... ");
    }
    

    或始终使用 getResultList(),即

    List results = query.getResultList();
    if (results.isEmpty()) {
        return null; // handle no-results case
    } else {
        return results.get(0);
    }
    

    如果您只期望一个结果,有时甚至可以进一步检查数据库完整性。

    if (results.size() > 1) {
        log.warn("Found duplicated result for...");
    }
    

    【讨论】:

    • 我忘了说它在postgresql的查询编辑器中返回一个结果。
    • 当我尝试你的建议时,我遇到了这个异常:org.jboss.resteasy.spi.UnhandledException: javax.ejb.EJBTransactionRolledbackException: No entity found for query
    • 这个异常的根本原因是什么?
    • 22:43:38,101 错误 [org.jboss.as.ejb3.tx.CMTTxInterceptor] (http--0.0.0.0-8080-3) javax.ejb.EJBTransactionRolledbackException: 找不到查询的实体22:43:38,103 错误 [org.jboss.ejb3.invocation] (http--0.0.0.0-8080-3) JBAS014134:方法公共抽象 java.math.BigDecimal 接口的组件 WaysHome 上的 EJB 调用失败。IservicesRouting.getLat( long): javax.ejb.EJBTransactionRolledbackException: No entity found for query
    • 对不起,我犯了一个错误,我调用了错误的方法,很抱歉打扰您
    【解决方案2】:

    我更喜欢这样做

    public class BwJpaResultHelper {
    public static Object getSingleResultOrNull(Query query){
        List results = query.getResultList();
        if (results.isEmpty()) return null;
        else if (results.size() == 1) return results.get(0);
        throw new NonUniqueResultException(results.size());
    }
    

    }

    【讨论】:

      【解决方案3】:

      我认为这个会没事的。它对我有用

      public Optional<UserDO> findByUserId(String userId) {
          List<UserDO> userDOList = list(namedQuery("User.findByUserId").setParameter("theUserId", userId));
          return (userDOList.isEmpty()) ? Optional.empty() : Optional.of(userDOList.get(0));
      }
      

      【讨论】:

        猜你喜欢
        • 2015-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-23
        相关资源
        最近更新 更多