2014-11-07 4 views
1

나는이 단체가 가입 테이블의 열을 얻을 : 만 idUser, 사용자와 idPerfil을 얻고 싶은최대 절전 모드 기준 투영

public class User 
{ 
    private Integer idUser; 
    private String user; 
    private String password; 
    private Perfil perfil; 

    Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "idUser", unique = true, nullable = false) 
    public Integer getIdUser() 
    { 
     return this.idUser; 
    } 

    public void setIdUser(Integer idUser) 
    { 
     this.idUser = idUser; 
    } 

    @Column(name = "user", nullable = false) 
    public String getUser() 
    { 
     return this.user; 
    } 

    public void setUser(String user) 
    { 
     this.user = user; 
    } 

    @Column(name = "password", nullable = false) 
    public String getPassword() 
    { 
     return this.password; 
    } 

    public void setPassword(String password) 
    { 
     this.password = password; 
    } 

    @OneToOne 
    @JoinColumn(name = "idPerfil", nullable = false) 
    public Perfil getIdPerfil() 
    { 
     return idPerfil; 
    } 

    public void setIdPerfil(Perfil idPerfil) 
    { 
     this.idPerfil = idPerfil; 
    } 
} 

public class Perfil 
{ 
    private Integer idPerfil; 
    private String perfil; 
    private String description; 

    Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "idPerfil", unique = true, nullable = false) 
    public Integer getIdPerfil() 
    { 
     return this.idPerfil; 
    } 

    public void setIdPerfil(Integer idPerfil) 
    { 
     this.idPerfil = idPerfil; 
    } 

    @Column(name = "description", nullable = false) 
    public String getDescription() 
    { 
     return this.description; 
    } 

    public void setDescription(String description) 
    { 
     this.description = description; 
    } 

} 

을; 는 I 이용 :

Session session = HibernateUtil.openSession(); 

     try 
     { 
      Criteria criteria = session.createCriteria(User.class); 
      ProjectionList proList = Projections.projectionList(); 
      proList.add(Projections.property("idUser"), "idUser"); 
      proList.add(Projections.property("user"), "user"); 
      proList.add(Projections.property("idPerfil"), "idPerfil"); 
      criteria.setProjection(proList); 
      criteria.setFetchMode("idPerfil.idPerfil", org.hibernate.FetchMode.JOIN); 
      criteria.setResultTransformer(Transformers.aliasToBean(User.class)); 
      List<User> list = criteria.list(); 
      return list; 
     } 
     catch (Exception e) 
     { 
      throw e; 
     } 
     finally 
     { 
      session.close(); 
     } 

엔티티 사용자는 내가 especify 속성의 값을 가져, 잘 작동하지만 idPerfil에서 나는 모든 값 속성을 얻고 난 단지 idPerfil를 원한다. 어떻게하면 쿼리를 할 수 있습니까? idPerfil 별칭을 추가

답변

2

시도 :

criteria.createAlias("idPerfil", "idp"); 

다음 투사에 참조 :

proList.add(Projections.property("idp.idPerfil"), "idPerfil"); 

그런 다음 변압기 제거 :

criteria.setResultTransformer(Transformers.aliasToBean(User.class)); 

을하고 그 결과를 변경 :

목록 목록 = criteria.list();

for(Object data : list) { 
    Object[] projection = (Object[]) data; 
    Integer idUser = projection[0]; 
    String user = projection[1]; 
    Integer idPerfil= projection[3]; 
    ... 
} 
+0

덕분에, 사람 :

목록의 각 요소는 객체 [] 배열 될 것입니다. 나는 월요일에 그것을 시험해보고 작동하는지 말해 주려고한다. – user3550529

+0

나는 그것을 사용한다. 그러나 criteria.setResultTransformer (Transformers.aliasToBean (User.class));를 사용할 때 오류가 발생한다. – user3550529

+0

org.hibernate.property.BasicPropertyAccessor $ BasicSetter.set HHH000091 : 예상 유형 : com.entity.Perfil, 실제 값 : java.lang.Integer 오류 org.hibernate.PropertyAccessException : com.entity.User의 setter를 호출하는 동안 IllegalArgumentException이 발생했습니다. .idPerfil org.hibernate.PropertyAccessException : com.User.idPerfil의 setter를 호출하는 중에 IllegalArgumentException이 발생했습니다. criteria.setResultTransformer (Transformers.aliasToBean (User.class))를 사용하지 않으면; idPerfil은 정수처럼 보이며 객체 – user3550529