我正在通过扩展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
。
答案 0 :(得分:0)
该子句用SQL编写
PhysicalNamingStrategy
仅可用于JPA名称。 This section of Hibenrate docs并未明确声明,但从以下语句可以很明显地看出来:
JPA兼容性
JPA定义了有关隐式逻辑名称确定的固有规则。如果JPA提供程序的可移植性是一个主要问题,或者您真的很喜欢JPA定义的隐式命名规则,请确保坚持使用ImplicitNamingStrategyJpaCompliantImpl(默认设置)
此外,JPA定义逻辑名称和物理名称之间没有分隔。根据JPA规范,逻辑名称是物理名称。如果JPA提供程序的可移植性很重要,则应用程序不应选择不指定PhysicalNamingStrategy。
很遗憾,您需要在@Where
子句中使用全名。