首页 > 解决方案 > JPQL 使用具有动态排序依据和限制的查询创建新对象

问题描述

我可以使用这个 JPQL 查询来创建我的自定义 DTO:

@Query("SELECT new com.mycompany.dto.UserDetailsDTO(vu.id, ru.active, ru.firstname, ru.lastname, ru.username, vu.logins, ru.email, COUNT(li.creator)) "
            + "FROM User vu inner join RemoteUser ru on vu.remoteUser = ru.username "
            + "inner join Item li on li.creator = vu.id "
            + "group by li.creator, ru.active, ru.firstname, ru.lastname, ru.username, vu.logins, vu.id, ru.email")
List<UserDetailsDTO> getAllUsers();

现在我想在上面的查询中添加order by, ASC/DESC, limit,offset以获得基于动态参数的结果,如下所示:

@Query("SELECT new com.mycompany.dto.UserDetailsDTO(vu.id, ru.active, ru.firstname, ru.lastname, ru.username, vu.logins, ru.email, COUNT(li.creator)) "
            + "FROM User vu inner join RemoteUser ru on vu.remoteUser = ru.username "
            + "inner join Item li on li.creator=vu.id "
            + "group by li.creator, ru.active, ru.firstname, ru.lastname, ru.username, vu.logins, vu.id, ru.email "
            + "order by = :orderBy :orderDir and offset = :pageNo and limit = :pageSize")
    List<UserDetailsDTO> getAllUsers(@Param("pageNo") int pageNo,
                                     @Param("pageSize") int pageSize,
                                     @Param("orderDir") String orderDir,
                                     @Param("orderBy") String orderBy);

但它不起作用,错误是:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: = near line 1, column 427

已经尝试将 pageable 作为参数传递:

Page<UserDetailsDTO> getAllUsers(Pageable pageable)

并准备页面请求,例如:

PageRequest pageRequest = PageRequest.of(pageNo, pageSize, Sort.by(Sort.Direction.valueOf(orderDir), orderFieldUid));

另外,我尝试过

+ "order by ?4 ?3 and offset ?1 and limit ?2")

有什么方法可以添加动态参数order byoffset?我想要在 JPQL 中类似这样的东西

标签: postgresqljpql

解决方案


Page<UserDetailsDTO> getAllUsers(Pageable pageable)最后,我通过在查询中使用不需要传递参数来修复它。Hibernate 将在内部从pageable


推荐阅读