私は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を誤解していますか?