在@where注释上应用自定义物理命名策略

时间:2019-04-04 11:31:28

标签: java spring hibernate spring-boot jpa

我正在通过扩展PhysicalNamingStrategyStandardImpl来设置CustomPhysicalNamingStrategy,以在与数据库映射之前在表名和列名后附加“ prefix__”。在正常的表名和列名(用@Column, @ColumnName注释的列名)的情况下,它对我有用,但是对于@Where却失败了。

@Where(clause = "item__c is null")

为此,item__c不会更改为prefix__item__c

休眠日志就像.....where ( serviceite0_.item__c is null).....

请对此提出建议。

我已经在spring-boot 2.0.8.RELEASE中尝试了这个用例。

Application.yml:

spring:
  jpa:
    hibernate:
     naming:
       physical-strategy: com.echo.dataprovider.config.CustomPhysicalNamingStrategy
       implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl

CustomPhysicalNamingStrategy.java

 public class CustomPhysicalNamingStrategy extends PhysicalNamingStrategyStandardImpl {

    private static final long serialVersionUID = -6136290474018632737L;

    @Override
    public Identifier toPhysicalColumnName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return addPrefix(super.toPhysicalColumnName(identifier, jdbcEnv));
    }

    @Override
    public Identifier toPhysicalTableName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return addPrefix(super.toPhysicalTableName(identifier, jdbcEnv));
    }

    private Identifier addPrefix(final Identifier identifier) {
        return (identifier == null
                || !identifier.getText().matches("(.*)" + "__A" + "(.*)"))
                        ? identifier
                        : Identifier.toIdentifier(String.join("__B__",
                                Arrays.stream(identifier.getText().split("__B__"))
                                        .map(m -> "prefix__" + m).toArray(String[]::new)));
    }
    }

Model.java

@Entity
@Table(name = "service__c", schema = "abc")
public class Service {

    @Id
    @Column(name = "id")
    private String id;

    @OneToMany(mappedBy = "service")
    **@Where(clause = "item__c is null")**
    private List<Item> itemList;
...

预期:

@Where(clause = "item__c is null")

为此:item__c应该更改为prefix__item__c

1 个答案:

答案 0 :(得分:0)

@Where javadoc

  

该子句用SQL编写

PhysicalNamingStrategy仅可用于JPA名称。 This section of Hibenrate docs并未明确声明,但从以下语句可以很明显地看出来:

  

JPA兼容性

     

JPA定义了有关隐式逻辑名称确定的固有规则。如果JPA提供程序的可移植性是一个主要问题,或者您真的很喜欢JPA定义的隐式命名规则,请确保坚持使用ImplicitNamingStrategyJpaCompliantImpl(默认设置)

     

此外,JPA定义逻辑名称和物理名称之间没有分隔。根据JPA规范,逻辑名称是物理名称。如果JPA提供程序的可移植性很重要,则应用程序不应选择不指定PhysicalNamingStrategy。

很遗憾,您需要在@Where子句中使用全名。