【发布时间】:2017-03-08 11:16:23
【问题描述】:
我在User 和Role 实体之间有一个关联manyToMany (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 进行一些自省以创建和初始化引发异常的实体的时候。
问题是User.setRoles(Set<Role>)方法调用了long参数:User的第一个Role实体列表的ID。而不是创建Set 的Role 然后将这些角色关联到User。
查询有问题吗?还是QueryDsl不支持?
我使用的是 QueryDsl 3.6.6(我用 3.7.4 测试过:结果相同)
【问题讨论】:
-
正如错误消息清楚地表明 - 您正在比较不匹配的类型。可能是这些条件之一:
public.USER_ROLE roles1_ ON user0_.ID=roles1_.USER_ID或public.ROLE role2_ ON roles1_.ROLE_ID=role2_.ID -
实际上,当我运行查询时,数据正在完美加载。问题来自实体/数据映射
-
来自 php,但我不认为你可以参数化 LIMIT
-
这是 JPQL 查询而不是纯 SQL
-
因为您期望给定用户具有多个角色,您可以尝试使用 .as(set(qUser.roles))。 querydsl.com/static/querydsl/3.1.1/reference/html/…