Как преобразовать набор результатов этого собственного запроса в список DTO - PullRequest
0 голосов
/ 06 мая 2020

У меня есть следующий DTO:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class EmployeeHierarchyDto {
    private Integer id;
    private Integer supervisorId;
    private Integer level;
    private String branch;
    private Integer position;
}

А позже у меня есть этот собственный запрос:

    public List<EmployeeDto> getAllSubordinateSubordinates(Integer employeeId) {
        if (employeeId == null) {
            employeeId = getCeo().getId();
        }
        EntityManager em = getEntityManager();
        String sqlString = "select t.id, " +
                "t.supervisor_id, " +
                "t.level, " +
                "t.branch, " +
                "t.pos " +
                "FROM connectby('public.employee'::text, 'id'::text, 'supervisor_id'::text, 'last_name'::text, " + "'" + employeeId +
                "'::text, 0, '~'::text) t(id int, supervisor_id int, level integer, branch text, pos integer);";
        Query q = em.createNativeQuery(sqlString);
        List hierarchyList = q.getResultList();
        List<EmployeeDto> employeeDtoList = new ArrayList<>();

        return employeeDtoList;
    }

Когда я отлаживаю код и копирую строку sql, сгенерированную в консоль db, это то, что я получаю, если, например, интерфейс передал идентификатор 93:

select t.id, t.supervisor_id, t.level, t.branch, t.pos FROM connectby('public.employee'::text, 'id'::text, 'supervisor_id'::text, 'last_name'::text, '93'::text, 0, '~'::text) t(id int, supervisor_id int, level integer, branch text, pos integer);

Приведенный выше запрос выполняется на 100% правильно в консоли db.

РЕДАКТИРОВАТЬ: точная ошибка:

11:39:50,711 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-3) SQL Error: 0, SQLState: 42601
11:39:50,714 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-3) ERROR: syntax error at or near ":"
  Position: 88

42601 указывает на синтаксическую ошибку PostgreSQL, однако, если строка, которая станет собственным запросом, будет скопирована из отладчика и вставлена в консоль db работает без проблем.

Почему это должно быть? И во-вторых, как я могу сопоставить набор результатов со списком EmployeeHierarchyDto

1 Ответ

1 голос
/ 06 мая 2020

Кажется, соответствует синтаксису, используемому оператором приведения postgres '. Это из-за того, что оператор приведения :: type конфликтует с синтаксисом параметра JPA: named.

Для этого существует множество обходных путей, см. cast-operator-issue-with-jpa

...