我有以下 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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top