![](/img/trans.png)
[英]@Value or @Autowired annotations not working with custom Physical Naming Strategy
[英]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
。
該子句是用SQL編寫的
PhysicalNamingStrategy
只能與JPA名稱一起使用。 Hibenrate文檔的這一部分沒有明確說明,但從這些陳述中可以清楚地看出:
JPA兼容性
JPA定義了關於隱式邏輯名稱確定的固有規則。 如果JPA提供程序可移植性是一個主要問題,或者您真的喜歡JPA定義的隱式命名規則,請務必堅持使用ImplicitNamingStrategyJpaCompliantImpl(默認值)
此外,JPA定義邏輯名稱和物理名稱之間沒有分離。 遵循JPA規范,邏輯名稱是物理名稱。 如果JPA提供程序可移植性很重要,應用程序應該不指定PhysicalNamingStrategy。
不幸的是,您需要在@Where
子句中使用全名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.