2009-04-28 2 views
0

최대 절전 모드 엔티티에 대한 ID를 포함하는 (최대 절전 모드가 아닌) 데이터베이스 테이블이 있습니다. 나는 이들을 질의 할 수있다. (createSQLQuery을 사용한다.) 그러면 나에게 엔티티를로드 할 수있다.SQLQuery 결과의 id 열에서 Hibernate Entity 인스턴스 가져 오기

나는 한 걸음에 그것을하고 싶다. 나는 addEntity으로 그 일을 할 수 있다고 생각한다. 그러나 나는 정확히 어떻게 확신 할 수 없다. (Hibernate의 문서 웹 사이트는 다시 내려 간다.) 엔티티 테이블에 대한 모든 컬럼이 존재할 때 addEntity을 사용할 수 있지만, 지금은 ID 만 가지고있다.

이 누락 된 컬럼에 대해 불평 :

return (List<MyEntity>) session.createSQLQuery(
      "select entity_id from the_table where foreign_key_value = ?") 
      .addEntity("entity_id", MyEntity.class) 
      .setLong(0, foreignKey).list(); 
+0

혹시이 문제를 둘러 보셨습니까? –

답변

0

내가이 오라클 사투리를 들어

select * 
from entity_table 
where entity_id = (select entity_id 
        from non_hibernate_table 
        where id = ?) 
+0

그럴 수도 있겠지만, 나는 Hibernate의 작업을 수행 할 것이다 :-) 또한, 이것은 lazy-loading과 엔티티 캐시를 건너 뛸 것이다. – Thilo

0

조인을 사용합니다. u는 자바 데이터 형식에 매핑 데이터베이스 열 유형에 문제가있는 경우 u는 그런 식으로 수동으로 설정할 수 있습니다

session.createSQLQuery("select {entity.*} from entity_table {entity} where ....") 
    .addEntity("entity", Entity.class).(bind-parameters).list(); 

Hibernate는 "확장됩니다 {엔티티 : .addScalar("integerFieldName", Hibernate.INTEGER)

public class LookupCodeName 
{ 
    private String code; 
    private String name; 

/*... getter-setters ... */ 
} 

public class someBL { 

public List<LookupCodeName> returnSomeEntity() { 
     SQLQuery sqlQuery = (SQLQuery)((HibernateSession)em).getHibernateSession() 
       .createSQLQuery("SELECT st.name as name, st.code as code FROM someTable st") 
       .addScalar("code") 
       .addScalar("name") 
.setResultTransformer(Transformers.aliasToBean(LookupCodeName.class)); 
    } 
return (List<LookupCodeName>)sqlQuery.list(); 
} 
1

난 당신이 뭔가를하려는 생각합니다. *} "는 entity_table의 관련 열입니다.

이미 ID가있는 경우 session.load()를 사용하여 실제 인스턴스 (게으른로드 프록시)로 변환 할 수 있습니다.

관련 문제