【问题标题】:JPQL Create new object using a query with dynamic order by and limitJPQL 使用具有动态排序依据和限制的查询创建新对象
【发布时间】:2021-01-06 08:05:12
【问题描述】:

我可以使用这个 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 byASC/DESClimitoffset,以获取基于动态参数的结果,如下所示:

@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 中的 this 之类的东西。

【问题讨论】:

  • 最后,我使用Page&lt;UserDetailsDTO&gt; getAllUsers(Pageable pageable) 修复了它,不需要在查询中传递参数。 Hibernate 将在内部从 pageable 获取参数

标签: postgresql jpql


【解决方案1】:

最后,我使用Page&lt;UserDetailsDTO&gt; getAllUsers(Pageable pageable) 修复了它,无需在查询中传递参数。 Hibernate 将在内部从pageable获取参数

【讨论】:

    猜你喜欢
    • 2021-08-10
    • 2011-12-04
    • 2011-08-26
    • 2019-09-16
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 2013-02-09
    • 2018-08-19
    相关资源
    最近更新 更多