Есть приложение на 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, а старая версия пользователя переместится в таблицу UserRecord_AUD с тем же идентификатором.
все сохраненные сущности имеют собственные записи в UserRecord_AUD
Моя задача - получить все объекты из 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>
{}
Мне нужен пользовательский метод, который может найти всех пользователей из таблицы UserRecord_AUD по id -list
вместо этого звоните в любое время
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);
Но есть исключение
Name for parameter binding must not be null or empty! On JDKs < 8, you need to use @Param for named parameters, on JDK 8 or better, be sure to compile with -parameters.; nested exception is java.lang.IllegalArgumentException: Name for parameter binding must not be null or empty! On JDKs < 8, you need to use @Param for named parameters, on JDK 8 or better, be sure to compile with -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);
Я попробую первый способ.
спасибо, но вторым способом вернули те же сущности. Пользователь написал и обновил 4 раза, но возвращает те же значения в старых полях и ту же версию для всех записей.