【问题标题】:QueryDsl: Exception "argument type mismatch" with projection bean and oneToMany or manyToMany associationQueryDsl:投影 bean 和 oneToMany 或 manyToMany 关联的异常“参数类型不匹配”
【发布时间】:2017-03-08 11:16:23
【问题描述】:

我在UserRole 实体之间有一个关联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。而不是创建SetRole 然后将这些角色关联到User

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

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

【问题讨论】:

  • 正如错误消息清楚地表明 - 您正在比较不匹配的类型。可能是这些条件之一:public.USER_ROLE roles1_ ON user0_.ID=roles1_.USER_IDpublic.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/…

标签: sql jpa querydsl


【解决方案1】:

我猜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. 如果没有问题,登录的相等性测试会抛出异常。

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

【讨论】:

  • 抱歉没有 UTILISATEUR 表,我想简化示例...我更正了示例查询。问题不是来自查询,而是来自查询数据和我的实体之间的数据绑定。
  • 因为 LEFT JOIN 从第一个表开始执行连接,然后是任何匹配的第二个表记录。并且根据表的关联规则生成的查询是完美的。缺少的是登录时的 btree 或哈希索引(如果未创建)。
  • 我看不出我的问题和登录有任何关系
【解决方案2】:

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

  • 课程
  • 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

【讨论】:

    猜你喜欢
    • 2016-03-01
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    相关资源
    最近更新 更多