如何在外部化的 jpa 原生查询中指定命名参数

问题描述

我需要将动态参数 :id 传递给我在 XML 中外部化的本机查询, 但是,我已经通过使用 @param 在我的存储库方法获取了参数,但这不起作用。我是否需要做更多的工作才能传递此参数。

<?xml version="1.0" encoding="UTF-8" ?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
                 version="1.0">
    <named-native-query name="RoleModulePermissionMapping.getAllNavigationMeunPermissionsByUserId">
        <query>
            <![CDATA[select
            md.name module_name,mdg.name module_group_name,pr.description,ur.name
            from {h-schema}nl_system_user s
            inner join {h-schema}nl_user_role_mapping urm on s.id=urm.sys_user_id
            inner join {h-schema}nl_user_role ur on ur.id=urm.role_id
            inner join {h-schema}nl_role_module_permission_mapping rmpm on rmpm.user_role_id=ur.id
            inner join {h-schema}nl_module md on md.id=rmpm.module_id
            inner join {h-schema}nl_module_group mdg on mdg.id=md.module_grp_id
            inner join {h-schema}nl_permission pr on pr.id=rmpm.permission_id
            where s.id=:id and pr.description !='restricted']]>
        </query>
    </named-native-query>
</entity-mappings>

JPARRepository

     @Repository
public interface RoleModulePermissionMappingRepository extends JpaRepository<RoleModulePermissionMapping,Long>,JpaSpecificationExecutor<RoleModulePermissionMapping> {
    public List<IUserRoleDTO> getAllNavigationMeunPermissionsByUserId(@Param("id") long id); 
}

public interface IUserRoleDTO {

    public String getRole();
    public String getModuleGroupName();
    public String getModuleName();
    public String getRouteUrl();
    public String getPermissions();
    public String getLevelOfAccess();
    public String getMdgdisplayOrder();
    public String getMddisplayOrder();
    public String getMdgIcon();
    public String MdIcon();
    public Boolean isNavigableMenu();
}

根据日志,查询工作正常,但在运行时未附加参数值,请告诉我相同的解决方法

解决方法

好的,问题是列无法映射到您的映射器接口 IUserRoleDTO,在您的本机查询中,您需要遵循驼峰命名约定,同时为每个列指定别名以获得正确的映射.

 <![CDATA[select
            md.name moduleName,mdg.name moduleGroupName,pr.description,ur.name
            ........
             ]]>