【问题标题】:[Spring boot ]Error in native query with join spring data jpa[Spring boot] 使用 join spring data jpa 进行本机查询时出错
【发布时间】:2021-03-09 00:34:04
【问题描述】:

我在 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: 无法从类型 [java.lang.Object[]] 转换为类型 [com.id.firstSpringBoot.entite.RoleEntite] 的值 '{ADMIN, 1 }';嵌套异常是 org.springframework.core.convert.ConverterNotFoundException:找不到能够从类型 [java.lang.String] 转换为类型 [com.id.firstSpringBoot.entite.RoleEntite] 的转换器

如何解决此错误并在我的函数 getGrantedAuthorities 中获取名称 ADMIN 可以做到这一点

【问题讨论】:

    标签: java spring-boot spring-data-jpa spring-repositories


    【解决方案1】:

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

    要返回实体,您需要将查询转换为 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
    

    }

    【讨论】:

    • 你好@Hopey One,你能给我一个例子,我可以同时拥有你的两个解决方案。你能接受我的 sql 请求并告诉我我该如何修改它吗,拜托。
    猜你喜欢
    • 1970-01-01
    • 2018-08-06
    • 2015-09-28
    • 2019-06-21
    • 2022-07-11
    • 2016-07-29
    • 2015-07-27
    • 2020-08-27
    • 2019-04-15
    相关资源
    最近更新 更多