Как сделать метод в crudRepository, чтобы найти какие-либо элементы, используя список идентификаторов? - PullRequest
0 голосов
/ 05 марта 2019

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

Моя сущность 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;

1 Ответ

1 голос
/ 05 марта 2019

В случае индексированного параметра используйте индексы

@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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...