2

Javaインターフェースで次のパラメーターを継承しようとしています(Spring Data JPAの例ですが、質問は一般的に注釈へのパラメーターに関するものです):

public interface ItemRepository<T extends Item> extends BaseRepository<T> {

    public final String type = null;



    @Query("select distinct i from " + type + " i " +
            "join i.tags t " +
            "join fetch i.locale where t = ?1")
    public List<T> findByTag(Tag t);
}

継承されたインターフェイスでは、次のようにすることができます。

public interface EventRepository extends ItemRepository<Event> {

    public final static String type = "Event";
}

残念ながら、変数「type」の文字列値が変数に関連付けられるのが遅すぎるため、注釈が作成されたとき、値はまだ null です。コンパイラに子インターフェイスから変数を関連付けさせることはできますか?

ありがとう

4

3 に答える 3

1

私は Java の専門家ではありませんが、あなたにはそれができないと思います。親クラスは子についての知識がありません。ただし、次のようなことができます。

public interface ItemRepository<T extends Item> extends BaseRepository<T> {

    public final String type = null;

    public static final String QUERY_PART1 = "select distinct i from ";
    public static final String QUERY_PART2 = " i " + 
            "join i.tags t " +
            "join fetch i.locale where t = ?1";
    public List<T> findByTag(Tag t);
}  

public interface EventRepository extends ItemRepository<Event> {

    public final static String type = "Event";

     @Query(QUERY_PART1 + type + QUERY_PART2)
}
于 2012-02-13T22:25:24.557 に答える
1

要するに、いいえ。コンパイラに「変数を子インターフェイスから関連付ける」ように強制することはできません。

Java コンパイラは、コンパイル時にすべての注釈値を決定できる必要があります。定数値を注釈ItemRepositoryに入れるには、クラスファイルに書き出す必要があります。@Queryあなたのコードでは、これがどの定数値になると思いますか?

たまたま、コンパイラはコンパイル時にこの注釈の値をコードから判断できます。ただし、それはまさにあなたが望む値ではありません。(私はあなたがフィールドから修飾子を誤って省略したと仮定しています-staticあなたのコードはそうでなければコンパイルされないと思います.フィールドをメソッドに置き換えた場合もコンパイルされません.)typeItemRepositorytypegetType()

あなたのコードは、コンパイル時にサブインターフェースの注釈値を決定できるように見えます。問題は、コンパイル時に superinterface のアノテーション値を決定できないItemRepositoryことです。

于 2012-02-13T23:06:12.087 に答える
0

結局、私は振る舞いと柔軟性のなさにとても不満を感じていたので、自分用に小さなツールを書きました。使用例は次のとおりです。

https://github.com/knyttl/Maite/wiki/Maite-Persistence

機能を定義する 2 つの子クラスと親クラスがあります。しかし、その秘訣は、クエリを構築する流暢なインターフェースにあります。どう思いますか?

于 2012-02-15T22:52:20.573 に答える