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
.
否则无法保证顺序
我想为 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
.