在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表中。
所有保存的entoties在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上,您需要在JDK 8或更高版本上使用@Param作为命名参数,请务必使用-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;
如果是索引参数,请使用索引
@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);