Как сделать метод в crudRepository для поиска любых элементов, используя идентификаторы списка?

Есть приложение на 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);

Но есть исключение

Имя для привязки параметра не должно быть нулевым или пустым! В JDK ‹ 8 вам нужно использовать @Param для именованных параметров, в JDK 8 или выше обязательно компилируйте с -parameters.; вложенным исключением является java.lang.IllegalArgumentException: имя для привязки параметра не должно быть нулевым или пустым! В 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;

person Roberto    schedule 05.03.2019    source источник


Ответы (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);
person Barath    schedule 05.03.2019
comment
спасибо, но вторым способом вернули те же сущности. Пользователь написал и обновил 4 раза, но возвращает те же значения в старых полях и ту же версию для всех записей. - person Roberto; 05.03.2019
comment
Я попробую первый способ. - person Roberto; 05.03.2019