Выберите из таблицы, используя параметры из связанных таблиц - PullRequest
0 голосов
/ 16 октября 2019

У меня есть 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. Пожалуйста, помогите

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Правильный ответ:

SELECT app FROM Application app
 INNER JOIN app.Customer customer
 INNER JOIN customer.userLocality
 locality WHERE customer.userLocality.id
 = :locality AND app.applicationDescribing
 LIKE CONCAT('%',:keyWord,'%')
0 голосов
/ 16 октября 2019

Это то, что вы ищете?

SELECT a.*
FROM application a
JOIN (SELECT * FROM customer c UNION ALL SELECT * FROM executor e) as u on a.customer_id=u.id
JOIN locality l on u.locality_id=l.id
WHERE a.description like '%<keyWord>%'
AND l.region = <region>;

Наверное, у меня к вам один вопрос: как вы различаете идентификатор клиента и идентификатор исполнителя?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...