Hibernate не может зарегистрировать функцию «LIMIT» MySQL на пользовательском диалекте - PullRequest
0 голосов
/ 06 октября 2018

Я хочу написать собственный диалект для Hibernate, чтобы он поддерживал функцию LIMIT в MYSQL, но даже если я регистрирую такую ​​функцию

    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);

И да, я добавил путь к собственному диалекту в application.properties

1 Ответ

0 голосов
/ 08 октября 2018

Это не то, как вы делаете нумерацию страниц с 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.

...