QueryDsl:与投影bean和oneToMany或manyToMany关联的异常"参数类型不匹配"

Thi*_*owa 6 sql jpa querydsl

我和实体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.而不是创造SetRole一种,那么这些角色的关联User.

查询有问题吗?或者QueryDsl不支持它?

我正在使用QueryDsl 3.6.6(我用3.7.4测试过:相同的结果)

bil*_*tch 0

我猜想这些 java.lang.IllegalArgumentException: argument type mismatch不是由 JOIN 比较引发的,您可以通过验证 3 个表UTILISATEUR、ROLE 和 USER_ROLE的 ID 类型来验证这一点。

  1. 如果两者之间的类型存在差异

UTILISATEUR.ID=USER_ROLE.USER_ID

或者

USER_ROLE..ROLE_ID=ROLE.ID

这就是问题所在。

  1. 如果没有问题,则通过登录相等性测试抛出异常。

但是,我怀疑 USER_ROLE 连接表未与正确的表连接。您可能有两个表 USER 和 UTILISATEUR 。除非您重命名连接表。