Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 通过实体ManagerFactory注册SQL函数_Hibernate_Jpa - Fatal编程技术网

Hibernate 通过实体ManagerFactory注册SQL函数

Hibernate 通过实体ManagerFactory注册SQL函数,hibernate,jpa,Hibernate,Jpa,在Hibernate中,我可以通过配置对象注册自定义SQL功能: public void registerExtensions(Configuration config) { config.addSqlFunction("s_sum", new StandardSQLFunction("sum")); ... } 我希望将此配置从“遗留”Hibernate切换到JPA 我已经读过,我可以通过专门化那里的方言来注册SQL函数: 这不是我想做的 在构建实体管理器工厂时,是否有方法注

在Hibernate中,我可以通过配置对象注册自定义SQL功能:

public void registerExtensions(Configuration config) {
    config.addSqlFunction("s_sum", new StandardSQLFunction("sum"));
    ...
}
我希望将此配置从“遗留”Hibernate切换到JPA

我已经读过,我可以通过专门化那里的方言来注册SQL函数: 这不是我想做的

在构建实体管理器工厂时,是否有方法注册这些功能


我正在Spring4.1环境中运行Hibernate4.3。

JPA通过
@namedquerys
@NamedQuery
注释注册SQL。它们与实体放在同一个类中。请参阅Javadoc:


自Hibernate ORM 5.2.18和5.3.1以来,在使用JPA时注册SQL函数的最佳方法是提供如下代码:

public class SqlFunctionsMetadataBuilderContributor 
        implements MetadataBuilderContributor {
         
    @Override
    public void contribute(MetadataBuilder metadataBuilder) {
        metadataBuilder.applySqlFunction(
            "group_concat",
            new StandardSQLFunction(
                "group_concat", 
                StandardBasicTypes.STRING
            )
        );
    }
}
您可以通过
Hibernate.metadata\u builder\u contributor配置属性将其传递到Hibernate:

<property>
    name="hibernate.metadata_builder_contributor" 
    value="com.vladmihalcea.book.hpjp.hibernate.query.function.SqlFunctionsMetadataBuilderContributor"
</property>

name=“hibernate.metadata\u builder\u contributor”
value=“com.vladmin.book.hpjp.hibernate.query.function.sqlfunctionsmetatabuilderContributor”
您可能读过一些文章,告诉您通过扩展Hibernate
方言来注册SQL函数,但这是一个幼稚的解决方案。有关避免扩展
方言的更多详细信息,请阅读


恐怕那不是我需要的。我们的目标是用新函数扩展hql,如本文所解释的,您链接到的原始帖子所说的扩展方言类。你试过了吗?我很想知道示例和/或用例。我想避免扩展方言,因为我的应用程序可以运行多个RDBMS。我必须用几乎相同的代码扩展几种方言。我想你可以得到Hibernate会话工厂并使用它?你不能,因为JPA没有这样的机制。在坚持这样做时,您总是将代码绑定到一个实现上。
public class SqlFunctionsMetadataBuilderContributor 
        implements MetadataBuilderContributor {
         
    @Override
    public void contribute(MetadataBuilder metadataBuilder) {
        metadataBuilder.applySqlFunction(
            "group_concat",
            new StandardSQLFunction(
                "group_concat", 
                StandardBasicTypes.STRING
            )
        );
    }
}
<property>
    name="hibernate.metadata_builder_contributor" 
    value="com.vladmihalcea.book.hpjp.hibernate.query.function.SqlFunctionsMetadataBuilderContributor"
</property>