【问题标题】:ClassCastException for com.querydsl.core.Tuplecom.querydsl.core.Tuple 的 ClassCastException
【发布时间】:2019-04-18 09:35:18
【问题描述】:

我遇到了异常

java.lang.ClassCastException: com.chat.dao.model.PGUserRoles cannot be cast to com.querydsl.core.Tuple

我的代码似乎是正确的。

JPAQuery<Tuple> query = new JPAQuery<Tuple>(entityManager);
QPGUserRoles pgUserRoles = QPGUserRoles.pGUserRoles;
List<Tuple> dataList = query
    .from(pgUserRoles)
    .where(isRoleName(userRolesDTO.getRoleName()),
        isRoleType(userRolesDTO.getRoleType()),
        isStatus(userRolesDTO.getStatus()),
        isStatusNotEq()
    )
    .offset(offset)
    .limit(limit)
    .orderBy(orderByRoleIdDesc())
    .fetch();
UserRolesDTO userData = null;
for (Tuple tuple : dataList) {
    userData = new UserRolesDTO();
    userData.setRoleId(tuple.get(pgUserRoles.roleId));
    userData.setRoleName(tuple.get(pgUserRoles.roleName));
    userData.setRoleType(tuple.get(pgUserRoles.roleType));
    userData.setStatus(tuple.get(pgUserRoles.status));
    userRoleList.add(userData);
}

for 处抛出异常

我不明白为什么会抛出异常。元组是通用查询结果投影。 doc 中的示例与我的类似。 我使用的是 querydsl 4.2.1 版本。

【问题讨论】:

  • 我认为fetch 方法返回的是List&lt;PGUserRoles&gt; 而不是List&lt;Tuple&gt;
  • 看起来List&lt;Tuple&gt; dataList = query 返回的列表没有返回元组列表,而是 PGUserRoles。请注意,尽管您在列表中使用了类型元组,但实际列表可能是不同的类型。见Type Erasue
  • @JeroenSteenbeeke 那没用。当用户在他的帖子中字面上说“我认为有一个错误”时,这就像说“我认为有一个错误”
  • @Jeroen Steenbeeke,你是对的。它正在返回 List。此代码曾经在 mysema.querydsl v3 中正常工作,但在升级到 querydsl v4 后,事情变得一团糟。
  • @Sarief 指出一个通常只在编译时生成警告但在运行时导致无效强制转换的问题没用?我之所以添加“我认为”是因为我不知道问题提到的具体API,并且OP在他的问题中没有提到泛型类型差异。

标签: java spring jpa spring-data-jpa querydsl


【解决方案1】:

从生成的类 QPGUserRoles 查询将返回 PGUserRoles 列表,即 List

我不知道元组是什么,但它显然是允许的,因为方法返回列表但不从返回的参数中获取列表的实际参数,而是从提供的生成类中获取。可能是糟糕的设计或 java 限制。

在所有情况下,您都必须更改代码。您的代码不正确,仅仅是因为它可以编译:)

upd:元组是 Select 语句的投影。你不使用它 - 结果不同;)

【讨论】:

  • 这段代码曾经在 mysema.querydsl v3 中正常工作,但升级到 querydsl v4 后,事情就搞砸了
  • 在这种情况下,返回并找出问题所在。这在我看来像一个错误,但可能是界面的变化。无论如何,我只能说:尝试调试和阅读补丁说明。如果是引入的错误 = 报告
  • @RC2793 如果您确实进行了举报,请在此处发布链接作为已接受的答案。在这种情况下你确实需要调试。
【解决方案2】:

好的,在修改我的代码一点点 wrt v4 之后。它现在工作。谢谢大家的支持。

JPAQuery<Tuple> query = new JPAQuery<Tuple>(entityManager);
        QPGUserRoles pgUserRoles = QPGUserRoles.pGUserRoles;
        List<Tuple> dataList = query
                .from(pgUserRoles)
                .select(pgUserRoles.roleId,
                        pgUserRoles.roleName,
                        pgUserRoles.roleType,
                        pgUserRoles.status)
                .where(isRoleName(userRolesDTO.getRoleName()),
                        isRoleType(userRolesDTO.getRoleType()),
               isStatus(userRolesDTO.getStatus()),
               isStatusNotEq()
                )
                .offset(offset)
                .limit(limit)
                .orderBy(orderByRoleIdDesc())
                .fetch();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 2021-12-05
    • 2012-02-08
    • 2012-01-01
    • 2017-01-10
    相关资源
    最近更新 更多