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

Hibernate@Formula不包含架构

傅乐湛
2023-03-14

我有一个实体与属性@公式像这样:

@Entity
@Table(name = "areasAuxiliar")
public final class AreaAuxiliar implements Serializable {

    @Id
    @Column(name = "idArea")
    private Integer idArea;

    @Formula("RUTAAREA(idArea)")
    private String ruta;

当我将hibernate配置为指向Oracle DB时,我没有问题,但是,当我切换到SQLServer时,hibernate不包括shema,并且查询失败,

为hibernate生成的查询如下所示:

select
    areaauxili4_.idArea as idArea1_6_4_,
    rutaArea(areaauxili4_.idArea) as formula2_4_
from
    SIGAP.areasAuxiliar areaauxili4_ 

参数hibernate.default_schema=SIGAP正在读取并包含在表中,但不包含在函数中,

在该函数中是否有强制shema的选项/注释?

我尝试了hibernate 5.1和5.2,结果相同:(

共有3个答案

鄂坚
2023-03-14

1) 我知道,对于本机查询,可以使用“{h-schema}”占位符(将用“hibernate.default_schema”参数的值填充):

"SELECT x FROM {h-schema}tableName"

尝试一下,看看这是否碰巧也适用于@Formula。。。

2)如果没有,您也可以尝试使用替换(即hibernate.query.substitutions),以便告诉hibernate将文字S替换为S'-在您的情况下,RUTAAREA替换为模式。RUTAAREA"?

刘成礼
2023-03-14

不确定这是否有助于应用到函数中,但是您是否尝试过将属性“模式”添加到@Table注释中:

@Entity
@Table(name = "areasAuxiliar", schema="mySchemaName")
public final class AreaAuxiliar implements Serializable {

    @Id
    @Column(name = "idArea")
    private Integer idArea;

    @Formula("RUTAAREA(idArea)")
    private String ruta;

另一个被转换为注释的解决方案是在注释中使用占位符

@Entity
@Table(name = "areasAuxiliar")
public final class AreaAuxiliar implements Serializable {

    @Id
    @Column(name = "idArea")
    private Integer idArea;

    @Formula("{SCHEMA_AND_FUNCTION}")
    private String ruta;

然后添加一个拦截器来填充公式的值。该解决方案的链接是Hibernate@Formula set value at runtime

最后,请参阅我关于在SQLSERVER中创建全局函数的评论。可以在此处找到详细信息我可以在SQL Server中创建全局函数吗?

杨海
2023-03-14

您可以使用mysql-orm.xml文件来覆盖您的公式,然后配置您的构建以在数据库为mysql时考虑到该文件。

在此覆盖公式:

<entity-mappings
    xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm orm_2_1.xsd"
    version="2.1">
    <package>com.acme.persistence</package>
    <entity class="AreaAuxiliar" access="FIELD">
        <attributes>
            <property name="ruta" formula="schemaName.RUTAAREA(idarea)"/>
        </attributes>
    </entity>
</entity-mappings>

然后将引用添加到特定的persistence.xml中。然后,在构建或运行时使用此persistence.xml覆盖默认persistence.xml(参见下面的链接)。

<persistence
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">

<persistence-unit name="persistenceUnit">

    <provider>
        org.hibernate.jpa.HibernatePersistenceProvider
    </provider>

    <mapping-file>
        mappings/identifier/global/mysql-orm.xml
    </mapping-file>

    <class>
        com.acme.persistence.AreaAuxiliar 
    </class>

</persistence-unit>

注意:Heavlly的灵感来源于如何根据底层数据库更改Hibernate GenerationType标识符

注意(2):在博客文章和这里,作者在运行时生成PeristextUnitInfo。

 类似资料:
  • 正在寻找旧JSF页面的解决方案。我试图使用contains方法根据另一列是否包含单词red box来呈现组合框。 这一个工作和组合框被禁用。 但是,我也想在值不包含红色框时渲染它们,但随后将启用combox。 这是行不通的。 因此,我如何测试的任何想法都不包含特定的单词。我还尝试了choose test when,但由于第一个表。col4值只是一个空字符串。 有什么想法吗?谢谢。

  • 问题内容: 我正在将整个数据库访问层从Hibernate重写为JOOQ,并且遇到以下问题。 使用@Formula批注对JPA模型之一进行批注,如下所示: 在代码的后面,对数据库进行JPA查询,该数据库将 Fee5 与参数进行比较: 上面的查询如何转换为JOOQ DSL? 问题答案: 我设法通过以下JOOQ查询解决了该问题:

  • 我是EF core的新手,我正在尝试让它与我的ASP一起工作。NET核心项目。 当尝试配置以使用配置中的连接字符串时,我在我的中得到上述错误。我正在遵循本教程。 问题代码在启动中。cs: 如果我将方法直接放入上下文中,则可以识别它: 我在网上的所有研究都指向缺失的参考文献,但我似乎无法找出我缺失的是哪一个(见图)。

  • Overview Quick setup Custom variables Advanced example Overview The Formulas plugin allows Handsontable to process formula expressions defined in the provided data. This plugin uses a formula-parser l

  • MathMLFormula 是一个 Flash 开发的组件用于在 Web 上显示 MathML 公式。

  • 基于百度 kityformula-editor 开发的公式编辑器,有 android 和 web 两种模式 安装 npm installnpm install -g anywhere // 随启随用的静态服务器 编译 grunt buildanywhere -p {port} // 这里anywhere是为了开静态服务器,预览index.html 特性 设备类型:device - pc/andro