我在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做一些内省来创建和初始化我的实体时抛出异常。
问题是User.setRoles(Set<Role>)
方法使用long
参数调用:Role
的第一个User
实体列表的ID。而不是创建Set
Role
,而是将这些角色与User
相关联。
查询有问题吗?或者QueryDsl不支持它?
我使用的是QueryDsl 3.6.6(我用3.7.4测试过:相同的结果)
答案 0 :(得分:0)
我想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。除非您重命名了联接表。
答案 1 :(得分:0)
我和你有同样的错误, 我尝试了不同的方法,这花了很多时间。最终我以这种方式成立了, 我的课程是:
我需要有关班级用户分数的一些信息。 我使用下面的查询返回数据。 我使用完全相关的模型来重调数据,但它给出了美丽的“参数类型不匹配”错误。 因此,我开发了一个静态类来返回数据。
JPAQuery query = new JPAQuery(em);
//select from which model you need
query.from(QLessonScores.lessonScores);
//use your condition
query.where(predicate);
//use query and returning data
Map<Lesson,List<LessonScoresModel.ScoresModel>> map = (Map<Lesson,List<LessonScoresModel.ScoresModel>>)
//use tranform for making group by
query.transform(GroupBy.groupBy(QLessonScores.lessonScores.lesson).as(
//return list of data which column we need
GroupBy.list(Projections.fields(LessonScoresModel.ScoresModel.class,
QLessonScores.lessonScores.score.as("score"),
QLessonScores.lessonScores.scoresType.as("scoresType"),
QLessonScores.lessonScores.success.as("success")
))
));
您将在这些链接中找到更多信息, codata programcreek