在 JPA2 存储库 @Query 语句中指定 LIMIT 子句
-
21-12-2019 - |
题
我有以下 MySQL 语句:
"SELECT * FROM $this->tableName WHERE news_publication_id = '" + newsPublicationId + "' AND list_order > '" + listOrder +"' ORDER BY list_order LIMIT 1"
我首先使用 Hibernate DAO 层开始数据处理路径。
它具有以下基于标准的方法:
@Override
public NewsHeading findNextWithListOrder(NewsPublication newsPublication, int listOrder) {
Criteria criteria = getSession().createCriteria(getPersistentClass());
criteria.add(Restrictions.eq("newsPublication", newsPublication));
criteria.add(Restrictions.gt("listOrder", listOrder)).addOrder(Order.asc("listOrder")).setMaxResults(1);
return (NewsHeading) criteria.uniqueResult();
}
而且效果很好。
然后我尝试做一个 JPA2 存储库层。
它现在具有以下基于 JPQL 的方法:
@Query("SELECT nh FROM NewsHeading nh WHERE nh.newsPublication = :newsPublication AND nh.listOrder > :listOrder ORDER BY nh.listOrder ASC LIMIT 1")
public NewsHeading findByNextListOrder(@Param("newsPublication") NewsPublication newsPublication, @Param("listOrder") int listOrder);
但这不起作用。因为 LIMIT 子句无效。
所以我想知道该怎么办。
我仍然可以在此 JPA2 存储库层中使用上述基于标准的方法吗?
我想避免信任客户端传递限制值,并且更愿意将该值(1)硬编码到我的层中。
此外,该语句仅返回一个对象,因此不需要分页。
任何提示将非常受欢迎。
亲切的问候,
斯蒂芬·艾伯特
解决方案
你可能可以用 PageRequest
. http://docs.spring.io/spring-data/jpa/docs/1.6.2.RELEASE/reference/html/repositories.html#repositories.core-concepts
Hibernate 希望你做的事 setMaxResults()
于 Query
对象,但 JPA 不直接与其交互。
其他选择是使用 @NamedNativeQuery
不隶属于 StackOverflow