2012-10-01 3 views
0

Hibernate retrieve는 빈리스트를 반환하고, 채워진리스트가 기대된다. 2 객체를 포함 는 매핑 주석 수행 :정확한 쿼리를 가진 Hibernate JPA 빈 결과

@Entity 
@Table(name = "parent") 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
class Parent { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "ID") 
    private long id; 
} 

@Entity 
@Table(name = "child") 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
class Child { 
    @ManyToOne 
    @JoinColumn(name = "parentId") 
    @OrderBy(value="id") 
    private Parent parent; 
} 

쿼리가 실행 :

String queryString = "select c from Child c where c.parent.id = ?1"; 
Query q = getEntityManager().createQuery(queryString); 
q.setParameter("1", parentId); 
return q.getResultList(); 

동면의 코드 세트는 사이즈 = 0.에 SQL 로깅을 켜고 공연으로 목록을 반환 실행할 때 MAMP의 로그에 제공된 쿼리가 예상 결과를 반환합니다.

답변

2

이 문제를 해결해야합니다

q.setParameter(1, parentId); 

현재 쿼리에 명명 된 매개 변수를 설정되는 Query.setParameter(String, Object)를 호출하지만 쿼리에 위치 매개 변수를 사용하고 있습니다. Query.setParameter(int, Object)으로 변경하면 위치 매개 변수가 설정되고 쿼리가 작동합니다. 대신이 수입

+0

나는 심지어 질문을 뭔가 간단하게 변경했을 때도 문제가 해결되지 않는다면 affraid입니다. "자식 C에서 선택 C"는 여전히 빈 목록을 반환합니다./Programmatically Child database is filled, 구성 문제가 아닙니다./ – Fico

1

문제는 트랜잭션 관리로 인해 발생했다 :이 일을 언급해야한다

import javax.persistence.Query 

. 우리는 트랜잭션 관리 방법을 나타 내기 위해 @Transactional for Spring을 사용했습니다. 그러나 우리의 거래 전략 중 일부는 잘못되었습니다.

이 문제는 누가 트랜잭션을 로깅하여 트랜잭션이 예상대로 커밋되었는지 확인해야합니다. 아직 커밋되지 않은 트랜잭션의 데이터에 액세스하지 못하도록합니다.

+0

정확히 무엇을했는지 자세히 설명해 주시겠습니까? 나는 거래의 한가운데에 있기 때문에. 그러나 쿼리가 트랜잭션을 사용하지 않는 것처럼 보입니다. –