休眠无法以自定义方言注册 MySQL 'LIMIT'函数



我想为 Hibernate 编写一种自定义方言以支持 MYSQL 的"LIMIT"函数,但即使我像这样注册函数

public class SiddheyMySQL57InnoDBDialect extends 
MySQL57InnoDBDialect {
public SiddheyMySQL57InnoDBDialect(){
super();
registerFunction("LIMIT",
new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "limit ?1"));
registerFunction("MATCH", new SQLFunctionTemplate(
StandardBasicTypes.INTEGER, "match(?1) against  (?2 in boolean mode)"));
}
}

但是当我在 HQL 中编写此查询时,休眠给了我一个异常

@Query("SELECT p FROM #{#entityName} p LIMIT(1)")
List<Product> getLimitedProducts(@Param("name") final String name);

是的,我在应用程序属性中添加了自定义方言的路径

这不是你用JPA和Hibernate进行分页的方式。LIMIT是特定于MySQL和PostgreSQL的关键字,而不是JPQL关键字。

此外,LIMIT(1)在MySQL中无效,因为LIMIT不是一个函数。您应该像这样使用它,而不是LIMIT 1本机SQL查询中使用它,而不是JPQL查询。

因此,您需要使用setMaxResults方法:

List<Product> products = entityManager.createQuery("""
SELECT p
FROM Product p
ORDER BY p.created_on DESC
""", Product.class)
.setMaxResults(50)
.getResultList();

您没有在查询中使用ORDER BY,这也是错误的,因为除非您使用ORDER BY,否则无法保证顺序。