Hibernate 无法在自定义方言中注册 MySQL 的 'LIMIT' 函数

Hibernate not able to register 'LIMIT' function of MySQL in custom dialect

我想为 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 中编写这个查询时,hibernate 给了我一个异常

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

是的,我在 application.properties

中添加了自定义方言的路径

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

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

所以,你需要使用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.

否则无法保证顺序