当前位置: 首页 > 知识库问答 >
问题:

[Spring boot]在连接Spring data jpa的本地查询中出错

居焱
2023-03-14

我在spring boot中与用户和角色有很多对很多的关系。我在数据库中有三个表(Role_utilisateur,users_roles和utilisateurs)。在我的存储库中,ireturn列出了我的名为RoleEntite的实体,它有两个属性(nom和id)。

@Query(value = "SELECT ROLE_UTILISATEUR.NOM, ROLE_UTILISATEUR.ROLE_ID " + "FROM ROLE_UTILISATEUR "
            + "INNER JOIN USERS_ROLES on users_roles.role_id = ROLE_UTILISATEUR.ROLE_ID "
            + "INNER JOIN UTILISATEURS on utilisateurs.utilisateur_id = USERS_ROLES.UTILISATEUR_ID "
            + "WHERE UTILISATEURS.UTILISATEUR_ID = :userId", nativeQuery = true)
    List<RoleEntite> findUsersRolesNative(@Param("userId") Long userId);

当我调用函数时

private List<GrantedAuthority> getGrantedAuthorities(UserEntite user) {
        List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
        List<RoleEntite> roleList = userRepository.findUsersRolesNative(user.getId());
        for (RoleEntite roleEntite : roleList) {
            authorities.add(new SimpleGrantedAuthority(roleEntite.getNom()));
        }
        return authorities;
    }

我在java eclipse中得到了这个错误

org.springframework.security.authentication.internalauthenticationServiceException:未能将值为“{ADMIN,1}”的类型[java.lang.object[]]转换为类型[com.id.firstspringboot.entite.Rolentite];嵌套异常是org.springframework.core.convert.converterNotFoundException:找不到能够从[java.lang.string]类型转换为[com.id.firstspringboot.entite.RoleEntite]类型的转换器

如何解决此错误并在函数getGrantedAuthorities中获取名称ADMIN

共有1个答案

潘凯
2023-03-14

问题是您选择了两列并返回一个实体列表。您需要选择查询中的实体,或者返回集合中的两个值列表。

要返回实体,需要将查询转换为JPQL。下面是本机查询的JPQL表示。我不得不对连接进行一些猜测(我假设您有一些与JPA相关的实体):

@Query(value = "SELECT RoleEntite r "
        + "INNER JOIN UserRole r.user u "
        + "INNER JOIN Utilisateurs u.Utilisateur x "
        + "WHERE x.UTILISATEUR_ID = :userId")
List<RoleEntite> findUsersRolesNative(@Param("userId") Long userId);

如果使用本机查询路由:

@Query(value = "SELECT ROLE_UTILISATEUR.NOM, ROLE_UTILISATEUR.ROLE_ID " + "FROM ROLE_UTILISATEUR "
        + "INNER JOIN USERS_ROLES on users_roles.role_id = ROLE_UTILISATEUR.ROLE_ID "
        + "INNER JOIN UTILISATEURS on utilisateurs.utilisateur_id = USERS_ROLES.UTILISATEUR_ID "
        + "WHERE UTILISATEURS.UTILISATEUR_ID = :userId", nativeQuery = true)
List<Object[]> findUsersRolesNative(@Param("userId") Long userId);

返回的列表应该产生:

for (Object[] obj : list) {
 nom = obj[0];
 roleId = obj[1];
 // ... do what ever you want with the values

}

 类似资料:
  • SpringDataJpa中 Specification怎样使用in查询 实体类Menu.java如下 想通过roles属性做in查询,代码如下 错误如下: Parameter value [com.appmtce.pojo.entity.role.Role@20f81e2a] did not match expected type [java.util.Collection (n/a)] 我的S

  • 我需要在elasticsearch中编写搜索查询,数据如下 场景:-用户想要搜索与p2相关的人,并使用每个相关的人找到他们与谁相关 1.首先找到与p2答案=p1相关的人。现在找到与p1答案=p3相关的人。(目前的要求是只进行1级),因此不需要找到与p3相关的人。最终结果应该是p2,p1,p3。 正常场景的我们将编写一个嵌套sql来获得结果。我们如何使用弹性查询语言一次性实现这一点

  • 如何在下面的本机搜索查询中添加查询超时?

  • MongoDB提供了lookup操作,用于实现两个表的关联聚合,但聚合操作编写起来比较麻烦,而且不符合面向对象的思维。为简化开发,bugu-mongo提供了一个JoinQuery类,用于实现两个表的连接查询。 JoinQuery借鉴了SQL左连接的概念: 当前表为左表,被连接的表为右表; 通过指定左键、右键进行关联; 对于不存在关联的数据,只会返回左表的数据,右表的数据为null。 创建JoinQ

  • 在HashMap中检索组键后,如何执行联接查询,该查询只显示那些详细信息,其中成员是该特定用户。如果这个结构是错误的,请帮助我。 结构:

  • 我试图在本地mac中运行以下代码,其中运行有主从集群的spark集群 但是,在主控制台和