2017-05-19 10 views
0

私は親クラスがあります。私はこのような応答を取得するためにHibernate Query Languageを使用してuserテーブルを照会することができすべての子エンティティの特定のプロパティをhibernateのリストとして取得するにはどうすればいいですか?

public class Role { 
    Long roleId; 
    Long roleName; 
} 

:基本的には

public class ResponseModel { 
    Long userId; 
    Long userName; 
    List<String> roleNames; 
} 

public class User { 
    Long id; 
    String name; 

    @OneToMany(...) 
    List<Role> roles 
    ... 
} 

役割のクラスを私はuserの属性のいくつかとユーザーのroleNamesのみを必要とし、豊富なob jects of Role

答えて

0

あなたはHQLに参加使用することができますし、

ResultTransformer

例以下UPDATED ResponseModelsのリストを返しますが、あなたが必要となるではない、まさに。

必須フィールドのみの取得方法を理解するための出発点です。

List<ResponseModel> responseModel = session 
      .createQuery(
        "select u.userId, r.roleId, r.roleName from User u join Role r ") 
      .setResultTransformer(
        new ResultTransformer() { 
         @Override 
         public Object transformTuple(
           Object[] tuple, 
           String[] aliases) { 
          return new ResponseModel(
            (Long) tuple[0], 
            (Long) tuple[1] 
            (String) tuple[2] 
          ); 
         } 

         @Override 
         public List transformList(List collection) { 
          return collection; 
         } 
        } 
      ) 
      .getResultList(); 
+1

これは、ロール名をコレクションに集約しないため、これは実行されません。しかし、出発点として使用されるかもしれません。 – user2612030

+0

@ user2612030はい、あなたは正しいです。ロールのリストを取得するには、別のクエリを使用するか、返されたリストを変換する必要があります。答えを更新しました。 –

0

代わりのHQLを使用して、あなたは、ユーザーオブジェクトとして値を取得するために基準を使用することができます。

基準から
Criteria criteria = session.createCriteria(User.class); 
    criteria.setFetchMode("roles", FetchMode.SELECT); 

リストあなたが必要とする役割の名前を取得することができます。

User user = (User)criteria.list().get(0); 

List<Role> roleList = user.getRoles(); 

List<String> roleNames = new ArrayList(); 

for(Role role : roleList) 
{ 

roleNames.add(role.getRoleName()); 

} 


ResponseModel responseModel = new ResponseModel(); 
responseModel.setUserID(user.getID()); 
responseModel.setUserName(user.getName()); 
responseModel.setRoleName(roleNames); 
+0

これはオブジェクト全体を読み込みます。したがって、パフォーマンスの観点からは、フェッチ句を持つ同様のHQLより優れているわけではありません。 – user2612030

関連する問題