当前位置: 首页 > 知识库问答 >
问题:

如何在Spring Boot应用程序中添加非标准化sql函数?

周玺
2023-03-14

我当前的设置是使用单独的方言,我可以在使用application-{profile}.yml之间切换;这是可行的,但是函数声明需要在不同的方言中重复,感觉不太理想。

看15.29。非标准化函数在Hibernate文档中,它说我应该使用org.Hibernate.cfg.configuration#addsqlfunction(),这似乎更易于移植,并且不需要扩展所有三种方言。

我的问题是:如何访问Spring Boot(1.3)应用程序中的Hibernateconfiguration类?缺省情况下没有要注入的bean,也没有LocalSessionFactoryBeanbean。

有人能给我指明正确的方向吗,或者用其他方法注册一次sql函数吗?

共有1个答案

谭飞掣
2023-03-14

我对这个问题颇有研究。

Hibernate使用org.Hibernate.dialt.dialt.sqlFunctionRegistry来识别DB函数。

下面是hibernate Core4.3.10的一个示例。在内部,它由两个私有字段组成:

/**
 * Defines a registry for SQLFunction instances
 *
 * @author Steve Ebersole
 */
public class SQLFunctionRegistry {
    private final Dialect dialect;
    private final Map<String, SQLFunction> userFunctions;

第一个字段表示数据库的方言。第二个包含用户定义的函数,这些函数可以由org.hibernate.cfg.configuration#addsqlfunction()填充。

不幸的是,在搜索hibernate源代码时,我发现在初始化hibernate时创建的配置对象没有以任何方式公开。

但是,我设法获得了对SQLFunctionRegistry的访问。

需要创建EntityManagerFactory类型的本地autowired字段

@Autowired
private EntityManagerFactory emFactory;

然后调用以下代码:

private void registerMyDbFunctions()
{
    SQLFunctionRegistry registry = this.emFactory.unwrap(org.hibernate.internal.SessionFactoryImpl.class).getSqlFunctionRegistry();
    Field field = ReflectionUtils.findField(SQLFunctionRegistry.class, "userFunctions");
    ReflectionUtils.makeAccessible(field);
    Map<String, SQLFunction> userFunctions = (Map<String, SQLFunction>)ReflectionUtils.getField(field, registry);

    userFunctions.put("my_func", new SQLFunctionTemplate(TextType.INSTANCE, "my_func(?1, ?2)"));
}
 类似资料:
  • 我正在使用camel-spring boot starter运行kafka消费者应用程序。SpringBoot应用程序实现CommandLineRunner。在我的应用程序中配置了以下属性。 我试图在端口8080上公开springboot执行器指标,但我在公开endpoint方面面临挑战,因为它是非Web应用程序。urlhttp://localhost:8080/actuator/metrics给

  • 问题内容: 我想在AngularJS应用程序中添加一些实用程序功能。例如: 将它们添加为服务的最佳方法是吗?从我所阅读的内容中我可以做到,但是然后我想在HTML页面中使用它们,因此如果它们在服务中仍然可行吗?例如,我可以使用以下内容: 有人可以举例说明如何添加这些内容。我应该创建服务还是有其他实现方法。最重要的是,我希望将这些实用程序功能存储在文件中,而不要与主要设置的另一部分结合使用。 我了解有

  • 问题内容: 有没有一种方法可以在网站上添加一些自定义字体而不使用图像,Flash或其他图形? 例如,当我在一个婚礼网站上工作时,发现该主题有很多不错的字体。但是我找不到在服务器上添加该字体的正确方法。以及如何将CSS中的字体包含在HTML中?没有图形就可以做到吗? 问题答案: 这可以通过CSS完成: 如果您使用TrueType字体(TTF)或Web开放字体格式(WOFF),则所有常规浏览器均支持该

  • 我试图在Firebase中创建一个动态链接,当我选择android应用程序时,它显示一个错误,说“将SHA-1添加到这个android应用程序”,我已经添加了一个凭据,但我不确定我到底如何“将SHA-1添加到应用程序” 这是怎么做到的?

  • 我有Kafka Streams java应用程序启动并运行。我试图使用KSQL创建简单的查询,并使用Kafka流来实现复杂的解决方案。我希望将KSQL和Kafka流作为Java应用程序运行。 我打算通过https://github.com/confluentinc/ksql/blob/master/ksqldb-examples/src/main/java/io/confluent/ksql/em

  • 我正在制作一个React原生应用程序。我想自定义应用程序图标(意思是你点击启动应用程序的图标)。我已经在谷歌上搜索过了,但我不断地发现不同类型的图标,它们指的是不同的东西。我如何将这些类型的图标添加到应用程序中?