Сортировка с разбивкой по страницам с использованием данных Native Query In Spring - PullRequest
0 голосов
/ 11 мая 2019

Я создаю собственный запрос, извлекающий ограниченные поля из нескольких таблиц. Эти поля сопоставляются с конструктором класса проекции с использованием сопоставления результирующих наборов sql. Я пытаюсь выполнить сортировку, передав параметр разбивки на страницы. Атрибуты сортировки определяются с помощью параметра запроса URL-адреса.

Ниже приведены фрагменты кода

<named-native-query
        name="EmployeeDet.findEmployeeAddressDTOUsingPageableUsingNativeQuery"
        result-set-mapping="CustomEmplMappingUsingXml">
        <query><![CDATA[select e.id,e.empName,e.dateOfBirth as dob,e.gender,e.email,address.typename 
        as addtype,address.addressdet,et.employeeTypeName as employeeType
        from employeedet as e,Address as address,employeetype as et
         where address.empid=e.id and e.employeeTypeId=et.employeeTypeId 
         group by  e.id,e.empName,e.dateOfBirth,e.gender,e.email,address.typename, 
         address.addressdet,et.employeeTypeName ORDER BY ?#{#pageable}]]>
        </query>
    </named-native-query>


<sql-result-set-mapping
        name="CustomEmplMappingUsingXml">
        <constructor-result
            target-class="com.springdatajpa.config.dto.EmployeeAddressDtoProjectionClass">
            <column name="id" class="java.lang.Integer" />
            <column name="empName" class="java.lang.String" />
            <column name="email" class="java.lang.String" />
            <column name="dob" class="java.lang.String" />
            <column name="gender" class="java.lang.String" />
            <column name="addtype" class="java.lang.String" />
            <column name="addressdet" class="java.lang.String" />
            <column name="employeeType" class="java.lang.String" />
        </constructor-result>
    </sql-result-set-mapping>

Вышеупомянутый запрос вызывается из уровня репозитория с именем метода, похожим на именованное собственное имя запроса

@Query(nativeQuery=true)
    Page<EmployeeAddressDtoProjectionClass> findEmployeeAddressDTOUsingPageableUsingNativeQuery(Pageable pageable);

Упомянутый параметр pageable передается через url со значением

?page=0&size=3&sort=empId,DESC

Поскольку возвращаемое значение имеет тип Page, я использую другой запрос для подсчета количества строк

<named-native-query
    name="EmployeeDet.findEmployeeAddressDTOUsingPageableUsingNativeQuery.count">
    <query><![CDATA[select count(*) from employeedet as e,Address as address,employeetype et
        where address.empid=e.id and et.employeeTypeId=e.employeeTypeId 
        group by e.id,e.empName,e.dateOfBirth,e.gender,e.email,address.typename,address.addressdet,et.employeeTypeName
        ]]></query>
    </named-native-query>

При выполнении вышеуказанного запроса я получаю сообщение об ошибке

org.springframework.dao.InvalidDataAccessResourceUsageException: Ожидаемое количество позиционных параметров: 1, фактически обнаружено 0

Я пробовал решения, упомянутые в разных ссылках переполнения стека, но все же получаю исключение.

...