如何通过使用CrudRepository findByName通过抽象的MappedSuperClass获取实体

时间:2018-06-24 09:06:12

标签: hibernate spring-boot generics spring-data-jpa spring-data

我有一个用例,其中我的大多数模型类都将id和name作为字段以及特定于实体的字段作为字段。

要达到相同的目的,我有一个超级类:

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;

@MappedSuperclass
public abstract class BasicEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String name;

    public BasicEntity() {

    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

派生类:

@Entity
public class DerivedEntity extends BasicEntity {

}

然后我尝试使用CrudRepository通过名称获取实体:

@Repository
public interface GenericRepository<T extends BasicEntity> extends CrudRepository<T, Integer> {

    //T findByName(String name);
}

此代码给出了错误

  

“不是实体:BasicEntity类”。

我在这里理解错误,这是错误的,因为类BasicEntity不是单独的实体,我想知道是否可以通过某种方式为crudRepository指定泛型,例如T扩展了BaseEntity而未包括BasicEntity。

我也知道我可以通过使用具体映射来映射BasicEntity类@entity和@Inheritance来使用继承,但我不希望那样。

还有其他解决方法吗?

1 个答案:

答案 0 :(得分:0)

您可以这样写

id_watch ==_id

现在创建一个基本存储库

  @Entity
  @Inheritance
  public abstract class BasicEntity {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private int id;

     private String name;

    }

现在另一个存储库扩展了基本存储库。

  @NoRepositoryBean
  public interface BaseRepository<T extends BasicEntity> 
  extends CrudRepository<T, Long> {

  public T findByName(String name);

  }

用于自定义查询 您可以像这样在Base Repository自定义查询中引用正确的实体

   public interface DevivedRepository extends BaseRepository<User> { /* ... */ }

entityName的值是T类型的jpa的rplacae

这将起作用