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

时间:2016-10-26 07:38:02

标签: sql jpa querydsl

我在manyToManyUser个实体(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测试过:相同的结果)

2 个答案:

答案 0 :(得分:0)

我想java.lang.IllegalArgumentException: argument type mismatch不是由 JOIN比较引发的,您可以通过验证3个表 UTILISATEUR,ROLE和USER_ROLE <的ID类型来验证强>

  1. 如果
  2. 之间的类型有差异
      

    UTILISATEUR.ID = USER_ROLE.USER_ID

      

    USER_ROLE..ROLE_ID = ROLE.ID

    这就是问题所在。

    1. 如果没有问题,则通过登录的相等性测试抛出异常。
    2. 但是,我怀疑USER_ROLE连接表没有连接正确的表。您可能有两个表USER和UTILISATEUR。除非您重命名了联接表。

答案 1 :(得分:0)

我和你有同样的错误, 我尝试了不同的方法,这花了很多时间。最终我以这种方式成立了, 我的课程是:

  • 课程
  • LessonScores用于保存用户分数
  • 用于返回数据的LessonScoresModel和
  • LessonScoresModel.ScoresModel是静态嵌套类

我需要有关班级用户分数的一些信息。 我使用下面的查询返回数据。 我使用完全相关的模型来重调数据,但它给出了美丽的“参数类型不匹配”错误。 因此,我开发了一个静态类来返回数据。

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