如何将本机查询的结果集转换为 DTO 列表
How to convert the result set of this native query to a list of DTOs
我有以下 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 字符串复制到数据库控制台时,如果前端传递了 93 的 ID,这就是我得到的结果:
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% 正确。
编辑:
确切的错误是:
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 语法错误,但是如果将成为本机查询的字符串从调试器复制并粘贴到数据库控制台,它可以正常工作。
为什么会这样?其次,如何将结果集映射到 EmployeeHierarchyDto's
的列表
这似乎与 postgres 的 cast 运算符使用的语法有关。
那是因为 :: 类型转换运算符与 JPA : 命名参数语法冲突。
有很多解决方法,请参阅 cast-operator-issue-with-jpa
我有以下 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 字符串复制到数据库控制台时,如果前端传递了 93 的 ID,这就是我得到的结果:
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% 正确。
编辑: 确切的错误是:
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 语法错误,但是如果将成为本机查询的字符串从调试器复制并粘贴到数据库控制台,它可以正常工作。
为什么会这样?其次,如何将结果集映射到 EmployeeHierarchyDto's
的列表这似乎与 postgres 的 cast 运算符使用的语法有关。 那是因为 :: 类型转换运算符与 JPA : 命名参数语法冲突。
有很多解决方法,请参阅 cast-operator-issue-with-jpa