2017-05-12 4 views
2

私は3つのエンティティと3者関係を持っています。selectcaseを使用した構造問合せでのJPAのNULL値の処理

public class User{} 
    public class UserGroup{} 
    public class Role{} 
    public class User2Role2Group{ 
     @ManyToOne(fetch = FetchType.EAGER) 
     @JoinColumn(name = "USER_ID", nullable = false) 
     private User user; 

     @ManyToOne(fetch = FetchType.EAGER) 
     @JoinColumn(name = "ROLE_ID", nullable = false) 
     private Role role; 

     @ManyToOne(fetch = FetchType.EAGER) 
     @JoinColumn(name = "USER_GROUP_ID") 
     private UserGroup group; 
    } 

User2Role2Groupのグループはnullです。

これは私のテストケースデータです。

+----------+----------------+---------+---------+ | URG_ID | USER_GROUP_ID | USER_ID | ROLE_ID | +----------+----------------+---------+---------+ | urg_id1 | user_group_id1 | userId | roleID1 | | urg_id2 | user_group_id2 | userId | roleID1 | | urg_id3 | null | userId | roleID1 | | urg_id4 | user_group_id2 | userId | roleID2 | | urg_id5 | user_group_id1 | userId | roleID2 | +----------+----------------+---------+---------+

は今、私はリストユーザーグループとユーザーに属する役割が含まれている値オブジェクト「RoleGroupコマンド」のリストを構築したいです。

これは私が書いたコードです。グループがnullでない場合は、データベース内のグループを取得します。それ以外の場合は、UserGroupのnullリテラルを作成します。

final CriteriaBuilder builder = em.getCriteriaBuilder(); 
    final CriteriaQuery<RoleGroup> criteria = builder.createQuery(RoleGroup.class); 
    final Root<User2Role2Group> from = criteria.from(User2Role2Group.class); 
    criteria.select(builder.construct(RoleGroup.class, from.get(User2Role2Group_.role), 
      builder.selectCase() 
        .when(builder.isNotNull(from.get(User2Role2Group_.group)), from.get(User2Role2Group_.group)) 
        .otherwise(builder.nullLiteral(UserGroup.class)))); 
    criteria.where(builder.equal(from.get(User2Role2Group_.user).get(User_.userId), userId)); 
    final TypedQuery<RoleGroup> query = em.createQuery(criteria); 
    return query.getResultList(); 

私が直面しています問題は、グループが私のテストデータのように、実際にnullであるとき、私は唯一のリターンとして4 RoleGroupsを取得することです。

私はいつか、そうでなければケースを回すと、私はさらにSerializationExceptionを取得します。

私はselectCaseを誤解していますか?

答えて

1

User2Role2Group_.groupを使用すると、定義によって、USER_GROUP_IDフィールドに非null値が含まれている場合にのみ結合されます。

クエリに明示的な結合を追加し、左結合としてマークしてnull値も取得します。私はコードをテストしていませんが、このようなものはあなたを動かすはずです。

Join<User2Role2Group, Group> join = from.join(User2Role2Group_.group, JoinType.LEFT); 
関連する問題