---)方法调用了 long参数:第Role的ID User 的实体列表.而不是创建 Set的 Role然后将这些角色关联到-6ren">
gpt4 book ai didi

sql - QueryDsl:带有投影 bean 和 oneToMany 或 manyToMany 关联的异常 "argument type mismatch"

转载 作者:行者123 更新时间:2023-12-04 09:30:04 24 4
gpt4 key购买 nike

我有一个协会manyToMany User之间和 Role实体(User >---< Role)

我想执行这个查询:

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)
)
);

生成的查询看起来像这样,对我来说它是完美的:
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 ?

但我有一个 java.lang.IllegalArgumentException: argument type mismatch .

我进行了调试,发现从数据库 id 加载的数据没有问题。这是 QueryDsl/Hibernate 进行一些自省(introspection)以创建和初始化引发异常的实体的时候。

问题是 User.setRoles(Set<Role>)方法调用了 long参数:第 Role的ID User 的实体列表.而不是创建 SetRole然后将这些角色关联到 User .

查询有问题吗?还是 QueryDsl 不支持?

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

最佳答案

我猜 java.lang.IllegalArgumentException: argument type mismatch不是由 抛出的加入比较您可以通过验证 3 个表的 ID 类型来验证 UTILISATEUR、ROLE 和 USER_ROLE .

  • 如果
  • 之间的类型不同

    UTILISATEUR.ID=USER_ROLE.USER_ID



    或者

    USER_ROLE..ROLE_ID=ROLE.ID



    所以这就是问题所在。
  • 如果没有问题,则通过登录的相等性测试抛出异常。

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

    关于sql - QueryDsl:带有投影 bean 和 oneToMany 或 manyToMany 关联的异常 "argument type mismatch",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40256348/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com