postgresql javax.persistence.NoResultException:未找到查询 JPQL 查询的实体

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/25616374/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-09 05:46:09  来源:igfitidea点击:

javax.persistence.NoResultException: No entity found for query JPQL Query

postgresqlrestjakarta-eejpajboss

提问by Khaled Smiri

@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;
}

Hi every body, here is my code, i want to know what's wrong with my query?

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

回答by zbig

There is nothing wrong with your query. Path expressions for Embeddables are perfectly valid in JPA. You just don't get no result for it. Javadoc for NoResultExceptionis pretty descriptive.

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

Thrown by the persistence provider when Query.getSingleResult() or TypedQuery.getSingleResult() is executed on a query and there is no result to return. This exception will not cause the current transaction, if one is active, to be marked for rollback.

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

I would suggest wrapping getSingleResult() in a try-catch block to handle no-result case

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

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

or to always use getResultList(), i.e.

或始终使用 getResultList(),即

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

You can even sometimes go further and check DB integrity if you are expecting only one result.

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

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

回答by lordUhuru

I prefer to do this

我更喜欢这样做

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());
}

}

}

回答by Vahap Gencdal

I think this one will be okay. it worked for me

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

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));
}