注释参数中的继承

时间:2012-02-13 22:16:42

标签: java inheritance annotations spring-data

我试图在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。我可以强制编译器关联子接口的变量吗?

由于

3 个答案:

答案 0 :(得分: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)
}

答案 1 :(得分:1)

简而言之,没有。您无法强制编译器“将子变量与子接口关联起来。”

Java编译器需要能够在编译时确定所有注释值。它需要在ItemRepository的类文件中写出一个常量值,放在@Query注释中。您认为这对您的代码有什么常数值?

实际上,编译器可以在编译时从代码中确定此注释的值。但是,它并不是您想要的价值。 (我假设您在static中的字段type中意外省略了ItemRepository修饰符 - 我相信您的代码不会编译。如果您不编译已使用type方法替换了您的getType()字段。)

您的代码看起来可以在编译时确定子接口的注释值。问题是,可以在编译时确定超级接口ItemRepository的注释值。

答案 2 :(得分:0)

最后,我对行为和不灵活性感到不满,因此我给自己写了一个小工具。使用的一个例子是:

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

有两个子类和父类定义功能。但诀窍在于构建查询的流畅界面。你觉得怎么样?