Java (CRUD)用于大量JPA类的存储库

Java (CRUD)用于大量JPA类的存储库,java,spring-boot,spring-data-jpa,Java,Spring Boot,Spring Data Jpa,我可以通过在适当的JPA类a上定义接口来创建存储库,如下所示: 公共接口ARepository扩展了Crudepository 除此之外,还有一个问题与上述有关。我可以在界面中定义findBy…方法,在后台会为这个特定属性生成一个查询方法。问题还在于,这是否可以以与前一个问题相关的动态方式完成,因为我有几组表需要补充查询方法。有一些表可以自动为您生成接口 关于你的第二个问题,我认为你不能用动态的方式来解决。Java是静态编译的,无法动态添加成员。可能有一个工具可以为这些方法生成代码,但如果该工具

我可以通过在适当的JPA类a上定义接口来创建存储库,如下所示:

公共接口ARepository扩展了Crudepository

除此之外,还有一个问题与上述有关。我可以在界面中定义
findBy…
方法,在后台会为这个特定属性生成一个查询方法。问题还在于,这是否可以以与前一个问题相关的动态方式完成,因为我有几组表需要补充查询方法。

有一些表可以自动为您生成接口

关于你的第二个问题,我认为你不能用动态的方式来解决。Java是静态编译的,无法动态添加成员。可能有一个工具可以为这些方法生成代码,但如果该工具为所有列的组合生成方法,那么最终将得到大量的方法。

有一个工具可以自动为您生成接口


关于你的第二个问题,我认为你不能用动态的方式来解决。Java是静态编译的,无法动态添加成员。可能有一个工具可以为这些方法生成代码,但是如果该工具为所有列的组合生成方法,那么最终将得到大量的方法。

您可以为您的500个类创建一个基本的抽象的实体,然后为该类创建一个repo。(我认为对于项目中的每个实体,都有一个带有
id
version
等的
BaseEntity
类是一种常见的做法)

对于简单的回购方法(如
save
findAll
等),它将直接从框中操作(注意-实体必须具有相同的
id
类型)。例如:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstarct class BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;
}

@Entity
public class Entity1 extends BaseEntity {
    private String name;
}

@Entity
public class Entity2 extends BaseEntity {
    private String name;
}

public interface BaseEntityRepo extends JpaRepository<BaseEntity, Long> {
}
关于第二个问题,您可以使用以下方法:

public interface BaseEntityRepo extends JpaRepository<BaseEntity, Long> {
    <T> T findById(Long id, Class<T> type);
}
但是,您只能为基类中存在的继承实体的“公共”属性构建repo查询方法。要使此方法有效,必须将
name
参数移动到
BaseEntity

<T> List<T> findAllByNameLike(String name, Class<T> type);
列出findAllByNameLike(字符串名称、类类型);

您可以为您的500个类创建一个基本的抽象的实体,然后为该类创建一个回购。(我认为对于项目中的每个实体,都有一个带有
id
version
等的
BaseEntity
类是一种常见的做法)

对于简单的回购方法(如
save
findAll
等),它将直接从框中操作(注意-实体必须具有相同的
id
类型)。例如:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstarct class BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;
}

@Entity
public class Entity1 extends BaseEntity {
    private String name;
}

@Entity
public class Entity2 extends BaseEntity {
    private String name;
}

public interface BaseEntityRepo extends JpaRepository<BaseEntity, Long> {
}
关于第二个问题,您可以使用以下方法:

public interface BaseEntityRepo extends JpaRepository<BaseEntity, Long> {
    <T> T findById(Long id, Class<T> type);
}
但是,您只能为基类中存在的继承实体的“公共”属性构建repo查询方法。要使此方法有效,必须将
name
参数移动到
BaseEntity

<T> List<T> findAllByNameLike(String name, Class<T> type);
列出findAllByNameLike(字符串名称、类类型);

首先感谢您的回答,但是生成存储库很容易在10-15分钟内完成。也许我不够清楚,我不想生成我将手工编写的代码。我想到了一些更通用的东西…首先感谢你的回答,但是生成存储库很容易在10-15分钟内完成…也许我不够清楚,我不想生成我将手工编写的代码。我想到了一些更一般的东西。。。