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