sql - 如何在 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;
解决方案
如果是索引参数,请使用索引
@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);
推荐阅读
- angular - 如何在 Angular 模板中插入标签名称
- kivy - 构建 APK 64 位目标 SDK 28
- c - 为什么只允许在 main() 中使用未定义大小的数组?
- c# - CSharpScript 的性能可以提高吗?
- vba - 列表框中的文本到数组中,除非我先单击列表框中的项目,否则文本不会进入我的数组
- python - 正则表达式引号之间的所有内容,包括换行符
- spring-data - 使用规范通过 IGNITE 执行查询
- python - 在 python 中进行子类化以在客户端代码中解耦的正确方法
- sql-loader - SQL 加载程序:列 DR165_CREDIT_LIMIT_EXP_DT :不是有效的月份错误
- python - 使用变量导入和使用 django 模型类