У меня возникла интересная проблема с аннотацией @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
аннотированных сущностей.Но так ли это?