Hibernate 如何使用Crudepository findByName通过抽象MappedSuperClass获取实体

Hibernate 如何使用Crudepository findByName通过抽象MappedSuperClass获取实体,hibernate,spring-boot,generics,spring-data-jpa,spring-data,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 cla

我有一个用例,其中我的大多数模型类都有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 {

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

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

    //T findByName(String name);
}
此代码给出一个错误

“不是一个实体:阶级的基本性

我理解这里的错误,它给出了错误,因为类BasicEntity不是一个单独的实体,我想知道是否有任何方法可以指定Crudepository的泛型,比如T扩展BaseEntity而不包括BasicEntity

我也知道我可以通过映射BasicEntity类@entity&@继承使用具体的映射来使用继承,但我不希望这样


我还有别的办法解决这个问题吗?

你可以这样写

  @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);

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

   public interface DevivedRepository extends BaseRepository<User> { /* ... */ }
用于自定义查询 您可以像这样在基本存储库自定义查询中引用正确的实体

  public interface BaseRepository 
  extends CrudRepository<T, Long> {

  @Query("select u from #{#entityName} as u where u.name = ?1 ")
  T findByName(String name);

  }
entityName的值是T类型jpa的rplacae

这会奏效的