52336


spring-boot+spring-data-jpaで既存アプリの再構築を行おうと思っていますが  
既存DBのカラム名の先頭にアンダースコアが付いているカラムがあり  
生成されたSQLのカラムエイリアスでsqlエラーとなってしまいます。  
カラム名自体は、@Column(name = "[__id]")とすることで  
出力されるSQLで"__id"に変換されることは確認していますが  
エイリアスを変更することは出来ないでしょうか？

テーブル設計を見直すべきは重々承知していますが、  
ひとまず、既存テーブルを利用し再構築を行いたいと思っています。

native queryを利用すると正常に行きますが、  
単純queryは出来るだけ記述せずにしたく  
対応の可否、可能な場合の方法などご存知でしたご教示ください。

spring-data-jpaで利用されるhibernate-coreは5.3.7となります。

以下、試してみたことです。

**パターン1: JpaRepositoryを使用しfindAll(実行時SQLエラー発生)**

[code]

    @Data
    @Entity
    @Table(name = "sample")
    public class sample {
        @Id
        @Column(name = "[__id]")
        private String id;
    
        @Column(name = "[year]")
        private Integer year;
    
[/code]

出力されたSQL

[code]

    select sample0_."__id" as __id_1_7_, sample0_."year" as year2_7_ from sample sample0_
    
[/code]

**パターン2: @Queryを使用しnativequeryを記述(正常に動作)**

[code]

    @Query("select \"__id\" as id, \"year\" from sample", nativeQuery = true)
    
[/code]

出力されたSQL

[code]

    select "__id" as id, "year" from sample
    
[/code]

よろしくお願いします。


CC BY-SA 4.0
2019-01-26T01:07:42.823
52328
2019-01-26T09:53:35.883
31929
question
spring-boot jpa hibernate
spring data jpaで自動生成されるSQLの変更方法


自動生成されるエイリアス名がアンダースコア始まりになるが、利用しているDBMSでは命名違反になるのでなんとかしたい、ということだと理解しました。

現行バージョンでは対処不能かなと考えます。

* * *

私も最近[エイリアス絡みの不具合](https://hibernate.atlassian.net/browse/HHH-5909)を踏んで似たような内容を調べていました。  
エイリアス名を取得する実装は
[`org.hibernate.mapping.Column#getAlias`](https://github.com/hibernate/hibernate-
orm/blob/5.3.7/hibernate-
core/src/main/java/org/hibernate/mapping/Column.java#L105)メソッドになります。

  * 生成するエイリアス名の命名戦略は固定でありコンフィグ等で変えられる余地はありません。
  * カラム名については [`getName`メソッド](https://github.com/hibernate/hibernate-orm/blob/5.3.7/hibernate-core/src/main/java/org/hibernate/mapping/Column.java#L72)に対応する[`getQuotedName`メソッド](https://github.com/hibernate/hibernate-orm/blob/5.4.0/hibernate-core/src/main/java/org/hibernate/mapping/Column.java#L94)が存在しますが、エイリアスについて対応するメソッドが無いのでクオートする仕組みが無いと予想します。

* * *

ちなみにリンクしたissueでも触れられていますが、[Hibernate6](http://in.relation.to/2018/12/06/hibernate-
orm-600-alpha1-out/)からはクエリにエイリアスを用いない方式になるそうなので自動的に問題は解決するかもしれません(ただし現状Hibernate6はまだアルファ版です)。


CC BY-SA 4.0
2019-01-26T09:53:35.883
52336
2019-01-26T09:53:35.883
2808
52328
answer