JPA выражение свойства репозитория - PullRequest
0 голосов
/ 28 июня 2018

В моем приложении Spring Boot (на основе JHipster 4) я пытаюсь использовать выражения свойств для фильтрации моего запроса по атрибутам связанных сущностей, как описано в документации Spring: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-property-expressions

Я хочу получить все назначения, с определенным счетом сотрудника в их AppointmentSchedules, но получить только пустой список.

@Repository
public interface AppointmentRepository extends JpaRepository<Appointment, Long> {

        public List<Appointment> findByScheduledAppointmentsEmployeeAccountsId(Long id);
}

соответствующие лица и их отношения:

@Entity
@Table(name = "appointment")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Appointment implements Serializable {

    @OneToMany(mappedBy = "appointments")
    @JsonIgnore
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<AppointmentSchedule> scheduledAppointments = new HashSet<>();

...

}

@Entity
@Table(name = "appointment_schedule")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class AppointmentSchedule implements Serializable {

    @ManyToMany
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @JoinTable(name = "appointment_schedule_employee_accounts", joinColumns = @JoinColumn(name = "appointment_schedules_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "employee_accounts_id", referencedColumnName = "id"))
    private Set<EmployeeAccount> employeeAccounts = new HashSet<>();

...

}

@Entity
@Table(name = "employee_account")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class EmployeeAccount implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

...

}

Вывод консоли Hibernate при выполнении запроса:

Hibernate: select appointmen0_.id as id1_1_, appointmen0_.institution_id as institut2_1_, appointmen0_.user_account_id as user_acc3_1_ from appointment appointmen0_ where appointmen0_.user_account_id=?

Буду очень признателен, если кто-нибудь скажет мне, что я здесь делаю не так.

Edit: Обратите внимание, что таблица Appointment не содержит столбец для AppointmentSchedules, так как это отношение OneToMany. Может в этом причина? Я думал, что JPA справится с этой логикой для меня ...

Структура таблицы:

APPOINTMENT;
ID      ...

APPOINTMENT_SCHEDULE;
ID      APPOINTMENTS_ID    ...

APPOINTMENT_SCHEDULE_EMPLOYEE_ACCOUNTS;
EMPLOYEE_ACCOUNTS_ID    APPOINTMENT_SCHEDULES_ID

EMPLOYEE_ACCOUNT;
ID    ...

РЕДАКТИРОВАТЬ 2: Я был в состоянии решить проблему. Это была классическая ошибка PEBCAK, потому что я случайно вызвал метод с аналогичным именем в своем классе обслуживания facepalm . Большое спасибо всем, кто мне помог! Ответы Гаурава Шривастава и Дина работают, но не являются необходимыми, так как оригинальный код из вопроса уже работает

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Да, добавьте слово In в ваш метод и укажите Set<Long> как employeeAccountIds.

Set<Person> findByScheduledAppointmentsEmployeeAccountsIdIn(Set<Long> employeeIds);
0 голосов
/ 28 июня 2018

Вы должны использовать подчеркивание, прежде чем ссылаться на вложенные поля. Попробуйте:

public List<Appointment> findByScheduledAppointments_EmployeeAccounts_Id(Long id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...