2014-09-02 4 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

귀하의 질의에 아무런 문제가 없습니다. Embeddable에 대한 경로 표현식은 JPA에서 완벽하게 유효합니다. 당신은 단지 그것에 대한 결과를 얻지 못합니다. NoResultException에 대한 Javadoc은 매우 이해하기 쉽습니다.

쿼리에서 Query.getSingleResult() 또는 TypedQuery.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); 
} 

당신은 수를 처리하지 않으려면 시도-catch 블록에 getSingleResult()를 포장 제안 하나의 결과 만 기대하는 경우 가끔씩 더 나아가 DB 무결성을 확인하십시오.

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

이. –

+0

당신이 나에게 제안한 것을 tryed했을 때 나는이 예외를 가지고있었습니다 : org.jboss.resteasy.spi.UnhandledException : javax.ejb.EJBTransactionRolledbackException : 쿼리에 엔티티가 없습니다. –

+0

이 예외의 근본 원인은 무엇입니까? – zbig

0

내가 할 선호 나는 그것이의 PostgreSQL 쿼리 편집기에서 결과를 반환 말을 잊었

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

}