Примените пользовательскую стратегию физического именования к аннотации @where - PullRequest
0 голосов
/ 04 апреля 2019

Я настраиваю 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.

1 Ответ

0 голосов
/ 04 апреля 2019

@Where Javadoc :

Предложение написано на SQL

PhysicalNamingStrategy может использоваться только с именами JPA. В этом разделе документации Hibenrate не говорится об этом явно, но из этих утверждений довольно ясно видно:

JPA-совместимость

JPA определяет неотъемлемые правила определения неявного логического имени. Если переносимость JPA-провайдера является серьезной проблемой, или если вам действительно нравятся правила неявного именования, определенные JPA, обязательно придерживайтесь ImplicitNamingStrategyJpaCompliantImpl (по умолчанию)

Кроме того, JPA не определяет разделения между логическим и физическим именем. Следуя спецификации JPA, логическое имя - это физическое имя. Если важна переносимость JPA-провайдера, приложения должны предпочитать не указывать PhysicalNamingStrategy.

К сожалению, вам нужно использовать полное имя в предложении @Where.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...