У меня есть простая модель данных с 3 элементами: Принципал (пользователь), а затем его настройки и данные профиля. UserSetting и UserProfile имеют ссылки на участника, но объект Principal не имеет ссылки ни на один из них (однонаправленный).
UserProfile ----> Principal <---- UserSettings
Вот объекты (показаны только поля, относящиеся к вопросу):
@Entity
public class Principal {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private boolean enabled;
}
@Entity
public class UserProfile {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne(fetch = FetchType.LAZY)
private Principal principal;
}
@Entity
public class UserSettings{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne(fetch = FetchType.LAZY)
private Principal principal;
private boolean isHidden;
}
Вот рабочий запрос JPA, который объединяет таблицы и извлекает все правильные данные:
@Query( "SELECT DISTINCT(userProfile) " +
"FROM UserProfile userProfile " +
"LEFT JOIN FETCH userProfile.principal AS principal " +
"WHERE principal.enabled = :enabled " +
"AND principal.id IN ( " +
"SELECT userSettings.principal.id " +
"FROM UserSettings userSettings " +
"WHERE userSettings.isHidden = :hidden)")
Есть ли способ создать спецификации JPA, которые будут делать следующее (имейте в виду, что у принципала нет ссылок на UserSettings или UserProfile):
а) Отфильтруйте профили пользователей, чьи принципы не включены
WHERE principal.enabled = :enabled
б) Отфильтровать профили пользователей для тех, кто решил скрыться в настройках пользователя.
AND principal.id IN (
SELECT userSettings.principal.id
FROM UserSettings userSettings
WHERE userSettings.isHidden = :hidden
)