Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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
Java Hibernate@Formula不包含架构_Java_Sql Server_Hibernate_Jpa_Hql - Fatal编程技术网

Java Hibernate@Formula不包含架构

Java Hibernate@Formula不包含架构,java,sql-server,hibernate,jpa,hql,Java,Sql Server,Hibernate,Jpa,Hql,我有一个实体,其属性@公式如下: @Entity @Table(name = "areasAuxiliar") public final class AreaAuxiliar implements Serializable { @Id @Column(name = "idArea") private Integer idArea; @Formula("RUTAAREA(idArea)") private String ruta; select

我有一个实体,其属性@公式如下:

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

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

    @Formula("RUTAAREA(idArea)")
    private String ruta;
select
    areaauxili4_.idArea as idArea1_6_4_,
    rutaArea(areaauxili4_.idArea) as formula2_4_
from
    SIGAP.areasAuxiliar areaauxili4_ 
当我将hibernate配置为指向Oracle DB时,我没有问题, 但是,当我切换到SQLServer时,hibernate不包括shema,查询失败

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

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

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

    @Formula("RUTAAREA(idArea)")
    private String ruta;
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,得到了相同的结果:

您可以使用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>
注:Heavlly的灵感来自

注2:在和中,作者在运行时生成PersistenceUnitInfo。

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

"SELECT x FROM {h-schema}tableName"
尝试一下,看看这是否碰巧也适用于@Formula


2如果没有,您也可以尝试使用替换,即hibernate.query.substitutions,以便告诉hibernate将文字S替换为S'-在您的例子中,RUTAAREA替换为schema.RUTAAREA?

不确定这是否有助于应用于函数,但是您是否尝试将属性“schema”添加到@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;
另一种转换为注释的解决方案是在@Formula注释中使用占位符

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

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

    @Formula("{SCHEMA_AND_FUNCTION}")
    private String ruta;
然后添加一个拦截器来填充公式的值。解决方案的链接是

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

一个更简化的解决方案:

从以下内容更改@公式:

@Formula("RUTAAREA(idArea)")
为此:

@Formula("{MYAPP_SCHEMA}.RUTAAREA(idArea)")
创建一个类:

public class HibernateEntityInterceptor extends EmptyInterceptor {

}
在sessionFactory中将其注册为实体拦截器,在我的情况下:

sessionFactory.setEntityInterceptor(new HibernateEntityInterceptor());
然后在该类中重写此方法:

public String onPrepareStatement(String sql) {
该方法在执行sql命令之前接收该命令,因此,您只需简单地全部替换:

sql = sql.replaceAll("\\{MYAPP_SCHEMA}", default_schema);
return sql;

thanx的帮助。

您在这里指的是什么函数?好的,@Formula.value的内容会逐字传递给查询。为RUTAAREA创建全局别名不确定SQLServer是否支持此类别名,或者在RUTAAREA前面添加架构name@crizzis我不能在代码中添加模式,因为它可以更改我不能为每种情况构建自定义部署,我不确定,但可以为表而不是函数创建别名:@crizzis我为dbo添加了一个函数别名,但它是相同的,查询结果如下:从sigap.areasAuxiliar中选择dbo.RUTAAREAidarea;没有dbo就无法识别它。我想这就是你想要的:你是否尝试了第二种替换方法?@Dan别误会,这基本上是你的答案,但我试图让它更清楚,只替换模式的关键字,而不是模式+函数,所以这也可以与NamedNativeQuery一起工作