2014-09-02 54 views
0
@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; 
} 

您好每一个机构,这里是我的代码,我想知道我的查询有什么问题?javax.persistence.NoResultException:找不到查询的实体JPQL查询

回答

6

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

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

我建议在try-catch块包装getSingleResult()来处理没有结果的情况下

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..."); 
} 
+0

我忘了说,它返回的PostgreSQL的查询编辑器的结果。 – 2014-09-02 11:31:02

+0

当我尝试了你建议我的时候,我有这个例外: org.jboss.resteasy.spi.UnhandledException:javax.ejb.EJBTransactionRolledbackException:找不到查询的实体 – 2014-09-02 11:31:44

+0

这个异常的根本原因是什么? – zbig 2014-09-02 12:23:08

0

我喜欢做这个

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

}