Hibernate 如何使用Crudepository findByName通过抽象MappedSuperClass获取实体
我有一个用例,其中我的大多数模型类都有id和name作为字段以及实体特定字段 为了实现同样的目标,我有一个超级类: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
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
这会奏效的