Не удается получить доступ к свойству встроенного класса через JPA

#spring-boot

Вопрос:

 @Entity @EntityListeners(AuditingEntityListener.class) @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "TIPO_CONTRATO", discriminatorType = DiscriminatorType.STRING) @JsonIgnoreProperties({ "hibernateLazyInitializer", "handler" }) public class Contrato extends AuditorEntity implements Serializable, Clonable {    @Column(name = "CIF_NIF")  @JsonView(Views.Buscador.class)  @JsonProperty("cifNif")  private String cifNif;   @Column(name = "NOMBRE_SOCIEDAD_PERSONA")  @JsonView(Views.Buscador.class)  private String nombreSociedadPersona; }  

И у меня есть этот встраиваемый класс, вызываемый CuentaBancaria из Contrato таблицы:

 @Embeddable public class CuentaBancaria implements Serializable {    private static final long serialVersionUID = 6835775213299596371L;   @Column(name = "TITULAR_CUENTA")  @JsonView(Views.Completo.class)  private String titularCuenta; }  

В ContratoRepository я пытаюсь выполнить запрос JPA, найдя « titularCuenta » поле поиска Cuenta Bancaria по cifNif полю Contrato . Но это не работает. Что я могу сделать, чтобы решить эту проблему?

 @Query(value="SELECT c.CuentaBancaria.titularCuenta FROM Contrato c WHERE c.cifNif= ?1 AND c.nombreSociedadPersona IS NOT NULL AND ROWNUM = 1")  public String getNombreLegalCliente(String cifNif);  

Ошибка, которая выбрасывает:

Вызвано: org.hibernate.Исключение запроса: не удалось разрешить свойство: CuentaBancaria из: com.xxxx.Contrato

Комментарии:

1. Можете ли вы обновить свой класс Contrato с помощью полей?

2. @BranislavLazic Да, я обновил вопрос

3. И это все поля?

4. У вас в классе нет поля с CuentaBancaria типом с @Embedded аннотацией Contrato .

Ответ №1:

Тебе не хватает CuentaBancaria поля в Contrato классе. Вот почему JQL жалуется.

Добавьте поле в класс с @Embedded аннотацией:

 public class Contrato extends AuditorEntity implements Serializable, Clonable {  @Embedded  private CuentaBancaria cuentaBancaria; }  

И исправьте выражение JQL в:

 @Query(value="SELECT c.cuentaBancaria.titularCuenta FROM Contrato c WHERE c.cifNif= ?1 AND c.nombreSociedadPersona IS NOT NULL AND ROWNUM = 1")  public String getNombreLegalCliente(String cifNif);  

Комментарии:

1. Но нельзя ли обойтись без добавления этого?

2. Вам нужно это поле. Или, я не знаю, сделать какой-нибудь грязный взлом с помощью простого SQL.