首页 > 解决方案 > 如何在 crudRepository 中创建方法以使用列表 ID 查找任何元素?

问题描述

Spring + jpa + jpa Crud存储库+ hibernate-envers上有应用程序

所以,我有一个包含任何字段的表 UserRecord

        Table UserRecord
id   name  surname  age version

       Table UserRecord_AUD
id   name  surname  age version REV REVINFO

因此,当我添加新用户时,它会写入 UserRecord 表。如果我改变年龄并尝试写入,新版本的用户写入 UserRecord,旧版本的用户移动到具有相同 ID 的 UserRecord_AUD 表中。

所有保存的实体在 UserRecord_AUD 中都有自己的记录

我的任务是通过 ID 列表从 UserRecord_AUD 中获取所有实体。

例子

===============================
    Table UserRecord
  11-1  Ivan      Ivanov  23 2
  22-2  Natasha   Ivanova 22 1
===============================
    Table UsersRecord_AUD
  11-1  Ivan      Ivanov  9  0
  11-1  Ivan      Ivanov  9  1
  22-2  Natasha   Ivanova 22 0
===============================

我有存储库:

@Repository
public interface UserRepository extends CrudRepository<UserRecord, String> 
{}

我需要自定义方法,它可以通过 id -list 从表 UserRecord_AUD 中找到所有用户

而是随时打电话

repository.find(id);

我需要打电话

repository.find(ids);

如何做到这一点:

我尝试过了:

@Query(value = "select id, name, surname, age, REV as VERSION, IDCALC from USERRECORD_AUD where PR_KEY in (:ids)", nativeQuery = true)
List<UserRecord> findHistoryByIds(List<String> ids);

但也有例外

参数绑定的名称不能为空或空!在 JDKs < 8 上,您需要对命名参数使用 @Param,在 JDK 8 或更高版本上,请务必使用 -parameters 进行编译。嵌套异常是 java.lang.IllegalArgumentException:参数绑定的名称不能为 null 或为空!在 JDKs < 8 上,您需要对命名参数使用 @Param,在 JDK 8 或更高版本上,请务必使用 -parameters 进行编译。

我的 JPA 实体是

@Entity
@Audited
@Table(name = "UserRecord")
@NoArgsConstructor(access = AccessLevel.PUBLIC)
@AllArgsConstructor
@Getter
@Setter
@Access(AccessType.FIELD)
public class UserRecord {
    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @Column(name = "id")
    private String id;

    @Column(name = "name", length = 100, unique = false)
    private String name;

    @Column(name = "surname", length = 100, nullable = false)
    private String surname;


    @Column(name = "age", length = 100, nullable = false)
    private String age;

    @Version
    private int version;

标签: sqlspringjpahibernate-envers

解决方案


如果是索引参数,请使用索引

@Query(value = "select id, name, surname, age, REV as VERSION, IDCALC from USERRECORD_AUD where PR_KEY in (?1)", nativeQuery = true)
List<RiskMetricRecord> findHistoryByIds(List<String> ids);

如果是命名参数,请使用@Param

@Query(value = "select id, name, surname, age, REV as VERSION, IDCALC from USERRECORD_AUD where PR_KEY in :ids", nativeQuery = true)
List<RiskMetricRecord> findHistoryByIds(@Param("ids") List<String> ids);

推荐阅读