如何在crudRepository中使用列表ID来查找任何元素?

时间:2019-03-05 13:25:42

标签: sql spring jpa hibernate-envers

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

但是有例外

  

参数绑定的名称不能为null或为空!在JDK <8上,您   在JDK 8或更高版本上,需要使用@Param作为命名参数,请确保   用-parameters编译。嵌套异常为   java.lang.IllegalArgumentException:参数绑定的名称必须   不能为null或为空!在JDK <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;

1 个答案:

答案 0 :(得分:1)

对于索引参数,请使用索引

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