У меня есть 3 таблицы (Entities) (postgreSQL):
@Entity
@Table(name = "application", schema = "applications")
public class Application implements Serializable {
@Id
@GeneratedValue
@Column(name = "application_id")
private long applicationId;
@Column(length = 400)
@Size(min=50, max=400)
private String applicationDescribing;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "customerId")
private Customer Customer;
.....
Также у меня есть абстрактный класс User с дочерним классом Customer, который имеет свою собственную таблицу в БД.
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Long userId;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "localitiesId")
private Localities userLocality;
.....
@Entity
@AttributeOverride(name="userId", column=@Column(name="customerId"))
public class Customer extends User {
@Column(length = 8)
private String userType;
.....
В таблице «Пользователь», а также в таблице «Клиент» есть много связанных таблиц Locality, связанных с помощью идентификатора.
@Entity
@Table(name = "localities", schema = "resource")
public class Localities implements Serializable {
@Id
@GeneratedValue
@Column(name = "id")
private long localitiesId;
@Column(name = "region", length = 50)
private String region;
....
Я пытаюсь реализовать поиск через приложение, используя (String) keyWord и locality_id (long) locality.
Первый подход:
@Query(value = "SELECT u FROM Application u WHERE u.applicationDescribing LIKE %:keyWord% " +
"AND userLocality IN (SELECT c FROM User c WHERE c.userLocality IN " +
"(SELECT l FROM Localities l WHERE l.localitiesId = :locality))")
List<Application> getApplicationsByKeyWordsAndRegion(@Param("keyWord") String keyWord, @Param("locality") long locality);
Второй подход (рекомендуется richyen):
@Query(value = "SELECT a FROM Application a " +
"JOIN Customer c ON a.customerid = c.userid " +
"JOIN Localities L ON c.localitiesid = L.id " +
"WHERE a.applicationDescribing LIKE %:keyWord% AND L.id = :locality")
List<Application> getApplicationsByKeyWordsAndRegion(@Param("keyWord") String keyWord, @Param("locality") long locality);
Оба не работают. В результате мне нужно List <Application>
, который имеет "keyWord" в описании поля и местоположения в Application.Customer.locality_id. Пожалуйста, помогите