Как получить данные с помощью foreignkey в спящем режиме? - PullRequest
0 голосов
/ 16 марта 2020

У меня есть две сущности, где ученик имеет адрес многоотношения. В ученике я использовал следующий фрагмент в моем примере.

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="ADDRESS_NR", nullable=false)
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) 
public Address getStudentAddress() {
 return this.studentAddress;
}

Теперь я пытаюсь получить данные таблицы истории, используя ADDRESS_NR, чем я. Я получаю сообщение об ошибке, как показано ниже

, а код извлечения кода равен

List personHistory = AuditReaderFactory.get(entityManager)
    .createQuery()
    .forRevisionsOfEntity(Student.class, false, true)
    .add(AuditEntity.property("ADDRESS_NR")
    .eq(id))
    .getResultList();

, а ошибка выглядит следующим образом

org.hibernate.QueryException: не удалось разрешить свойство: ADDRESS_NR из: com.audit.test.Student_AUD [выберите e__, r из com.audit.test.Student_AUD e__, com.audit.test.AuditRevisionEntity r, где e __. ADDRESS_NR =: _p0 и e__.originalId.REVid = r.id заказ по e__.originalId.REV.id asc] "

Может кто-нибудь мне помочь?

1 Ответ

0 голосов
/ 18 марта 2020

В этой ситуации важно понимать различие между столбцом и свойством.

Всякий раз, когда вы используете метод AuditProperty#property(String), вы просите Envers разрешить свойство объектной модели в сопоставлении столбца, поэтому вы хотите быть уверены, что в качестве фрагмента кода вы указали имя свойства, а не явное имя столбца.

Другими словами, я ожидаю, что ваш код будет выполнять следующие действия:

List personHistory = AuditReaderFactory.get(entityManager)
  .createQuery()
  .forRevisionsOfEntity(Student.class, false, true)
  .traverseRelation("studentAddress", JoinType.LEFT, "address")
  .up()
  .add(AuditEntity.relatedId("studentAddress").eq(id))
  .getResultList();

Я включил здесь вызов метода traverseRelation, чтобы проиллюстрировать, как можно добавить дополнительные предикаты в отношении Address при необходимости, включив те из них, которые предшествуют вызову up(), так как они будут предикатами на основе таблицы соединений связанный с Address.

...