com.querydsl.core.Tuple 的 ClassCastException

ClassCastException for com.querydsl.core.Tuple

我收到异常

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 版本。

从生成的 class QPGUserRoles 查询将 return PGUserRoles 列表,即 List

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

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

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

好的,在对 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();