代码之家  ›  专栏  ›  技术社区  ›  jsight TaherT

如何使用Hibernate调用自定义数据库函数?

  •  12
  • jsight TaherT  · 技术社区  · 15 年前

    如果我要在数据库中定义一些函数(可能是Postgres或任何其他数据库):

    create or replace function isValidCookie(ckie);
    

    我从SQL中将其称为:

    select * from cookietable c where isValidCookie(c.cookie);
    

    如何从Hibernate调用这样的自定义函数?

    3 回复  |  直到 8 年前
        1
  •  13
  •   ChssPly76    12 年前

    如果要在HQL中使用自定义函数,则需要在适当的 Dialect

    看一看 PostgreSQLDialect (或者其他的,真的)来源,你会看到很多 registerFunction() 电话。您还需要为自己的自定义函数添加一个:-)。

    然后,您必须在休眠配置中指定自己的方言。

        2
  •  3
  •   Vincent Ramdhanie    15 年前

    您可以使用本机查询来实现这一点。这个 doc 解释。

        3
  •  3
  •   Trevor Robinson    8 年前

    从Hibernate 5开始,如果不想依赖或自定义方言,可以定义 MetadataBuilderInitializer . 例如,使用mysql DATE_ADD 用一个 INTERVAL 从hql,可以定义一个自定义函数 date_add_interval :

    public class DateAddIntervalMetadataBuilderInitializer
            implements MetadataBuilderInitializer {
        @Override
        public void contribute(MetadataBuilder metadataBuilder,
                StandardServiceRegistry serviceRegistry) {
            metadataBuilder.applySqlFunction("date_add_interval",
                new SQLFunctionTemplate(DateType.INSTANCE,
                    "DATE_ADD(?1, INTERVAL ?2 ?3)"));
        }
    }
    

    您还需要将类的名称放在名为 META-INF/services/org.hibernate.boot.spi.MetadataBuilderInitializer .

    当通过JPA和/或Spring这样的框架使用Hibernate时,这种方法特别有用,其中配置是由框架隐式执行的。