Я настраиваю CustomPhysicalNamingStrategy, расширяя PhysicalNamingStrategyStandardImpl, добавляя «prefix__
» с именами таблиц и столбцов перед сопоставлением с БД. И это сработало для меня в случае обычных имен таблиц и столбцов (имена столбцов отмечены @Column, @ColumnName
), но это не удалось для @Where
.
@Where(clause = "item__c is null")
Для этого: item__c
не меняется на prefix__item__c
.
Журнал Hibernate похож на .....where ( serviceite0_.item__c is null).....
Пожалуйста, предложите это.
Я пробовал этот сценарий использования с пружинным загрузчиком 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
.