Взаимодействие Spring Data JPA @Query аннотации и Hibernate @Where аннотации - PullRequest
0 голосов
/ 12 марта 2019

У меня возникла интересная проблема с аннотацией @Where и аннотацией @Query в проекте с загрузочной пружиной, также в проекте также есть jpa data.

По сути, у меня есть механизм мягкого удаления, и он предназначен для установки допустимой даты для сущности (скажем, свойство valide_date столбец со свойством validDate в классе сущности).Эти сущности снабжены аннотацией @Where что-то вроде @Where("valid_date > now()").Таким образом, автоматически удаленные объекты, для которых valid_date установлены в настоящее время и ранее, удаляются автоматически.(например, класс сущностей User)

@Entity
@Table(name = "user")
@SQLDelete(sql = "...") // to update valid date for soft deleting entity
@Where(clause="valid_date > now()") //to apply non deleted entity automatically
public class User {

    @OneToOne(...)
    BaseEntity base;
}

У меня также есть некоторые другие сущности, у которых нет valid_date. (например, класс сущностей UserRequest)

@Entity
@Table(name = "user_request") //
public class UserRequest {

    @OneToOne(...)
    BaseEntity base;
}

и некоторыедругие доступные таблицы также.В случае Jpa Query аннотированный метод.Я сталкиваюсь с некоторыми проблемами.

@Query("SELECT new com.foo.RequestListDto(B, S, I, U) from UserRequest B " +
        " left join fetch AnotherTable I on I.base = B.base" +
        " left join fetch User U on U.base = B.base" +
        " left join fetch UserRequest S on S.base = B.base " +
        " where B.id IN :idList")

В основном я создаю список запросов DTO, который представляет собой набор различных свойств из разных таблиц на основе объединения общих свойств.

Когда вызывается метод с указанной выше аннотацией @Query;Глядя на сгенерированный sql;Я не могу видеть предложение valid_date > now (), примененное к сущности пользователя.«ЕСЛИ» сущность пользователя находится на стороне соединения, как показано выше.Если я изменю предложение from на "from User U", то к запросу применяется правило valid_date.

В итоге;@Where аннотация применяется только в том случае, если содержащая сущность находится в предложении from.Но не применяется, если содержащая сущность не включена в условие from.

Есть ли конкретная причина не применять аннотацию @Where, которую я не знаю?Что я должен сделать, чтобы автоматически применить аннотацию @Where?

Примечание. Я могу расширить эти предложения "join on ..." до join on ... and U.validDate > :now для @Where аннотированных сущностей.Но так ли это?

1 Ответ

0 голосов
/ 13 марта 2019

Аннотация @Where работает точно так же, как и должна работать. Только в запросах, где from является аннотированной сущностью. Если вы хотите использовать его для join, вам нужно также добавить аннотацию «определение соединения» - это свойство, аннотированное аннотацией @OneToOne. Вы также можете добавить аннотацию @Where к свойствам. Поэтому добавьте аннотацию @Where к свойству User в сущности, которую вы хотите использовать в части from запроса

@OneToOne(...)
@Where(clause="valid_date > now()")
User user;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...