簡體   English   中英

在@where注釋上應用自定義物理命名策略

[英]Apply custom physical naming strategy on @where annotation

我通過擴展PhysicalNamingStrategyStandardImpl來設置CustomPhysicalNamingStrategy,以便在使用DB映射之前附加帶有表名和列名的“ prefix__ ”。 它對我有用,包括普通的表名和列名(用@Column, @ColumnName注釋的列名, @Column, @ColumnName ),但它對@Where失敗了。

@Where(clause = "item__c is null")

為此: item__c不會更改為prefix__item__c

Hibernate日志就像.....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

@Where javadoc

該子句是用SQL編寫的

PhysicalNamingStrategy只能與JPA名稱一起使用。 Hibenrate文檔的這一部分沒有明確說明,但從這些陳述中可以清楚地看出:

JPA兼容性

JPA定義了關於隱式邏輯名稱確定的固有規則。 如果JPA提供程序可移植性是一個主要問題,或者您真的喜歡JPA定義的隱式命名規則,請務必堅持使用ImplicitNamingStrategyJpaCompliantImpl(默認值)

此外,JPA定義邏輯名稱和物理名稱之間沒有分離。 遵循JPA規范,邏輯名稱是物理名稱。 如果JPA提供程序可移植性很重要,應用程序應該不指定PhysicalNamingStrategy。

不幸的是,您需要在@Where子句中使用全名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM