我和实体manyToMany之间有关联(> --- < )UserRoleUserRole
我想执行此查询:
createQuery()
.from(qUser)
.leftJoin(qUser.roles, qRole)
.where(qUser.login.eq(login))
.singleResult(
Projections.bean(User.class,
qUser.id,
qUser.login,
qUser.password,
GroupBy.set(Projections.bean(Role.class,
qRole.id,
qRole.code
)).as(qUser.roles)
)
);
Run Code Online (Sandbox Code Playgroud)
生成的查询看起来像这样,对我来说它是完美的:
SELECT user0_.ID AS col_0_0_,
user0_.LOGIN AS col_1_0_,
user0_.PASSWORD AS col_2_0_,
role2_.ID AS col_4_0_,
role2_.CODE AS col_5_0_
FROM public.USER user0_
LEFT OUTER JOIN public.USER_ROLE roles1_ ON user0_.ID=roles1_.USER_ID
LEFT OUTER JOIN public.ROLE role2_ ON roles1_.ROLE_ID=role2_.ID
WHERE user0_.LOGIN=? LIMIT ?
Run Code Online (Sandbox Code Playgroud)
但我有一个java.lang.IllegalArgumentException: argument type mismatch.
我调试了,我发现数据库id中的数据加载没有问题.这是在QueryDsl/Hibernate做一些内省来创建和初始化我抛出异常的实体的时候.
问题是该User.setRoles(Set<Role>)方法使用long参数调用:第一个Role实体列表的ID User.而不是创造Set的Role一种,那么这些角色的关联User.
查询有问题吗?或者QueryDsl不支持它?
我正在使用QueryDsl 3.6.6(我用3.7.4测试过:相同的结果)
我猜想这些 java.lang.IllegalArgumentException: argument type mismatch不是由 JOIN 比较引发的,您可以通过验证 3 个表UTILISATEUR、ROLE 和 USER_ROLE的 ID 类型来验证这一点。
UTILISATEUR.ID=USER_ROLE.USER_ID
或者
USER_ROLE..ROLE_ID=ROLE.ID
这就是问题所在。
但是,我怀疑 USER_ROLE 连接表未与正确的表连接。您可能有两个表 USER 和 UTILISATEUR 。除非您重命名连接表。
| 归档时间: |
|
| 查看次数: |
717 次 |
| 最近记录: |