Я искал много мест и не нашел ответа на свой вопрос, поэтому я опишу свою проблему.У меня есть пользовательский класс, который содержит другой объект.Внутренний объект имеет список последующих элементов как @ElementCollection.Я делаю поиск пользователей в различных областях, и мне это удалось до сих пор.Однако я столкнулся с проблемой, когда хочу найти хотя бы один элемент из списка в списке пользователей в базе данных.Следующий код работает, однако, так как я не хочу искать это поле (у меня есть несколько пользователей в базе данных, у которых нет этого поля), он не находит всех пользователей в базе данных, но только тех, у кого установлено это поле.
Мой класс пользователя:
public class User {
...
@OneToOne
@Cascade(org.hibernate.annotations.CascadeType.MERGE)
private AppearanceAndCharacter appearanceAndCharacter;
...
}
AppearanceAndCharacter class:
public class AppearanceAndCharacter {
...
@JoinTable(name = "looking_for")
private Set<LookingFor> lookingFor;
...
}
Мой запрос Jpa:
public interface UserRepository extends JpaRepository<User, Long> {
...
@Query(value = "select u from User u, in(u.appearanceAndCharacter.lookingFor) lf where (u.sex = :sex or :sex is null) and (u.dateOfBirth <= :ageFrom or :ageFrom is null)" +
"and (u.dateOfBirth >= :ageTo or :ageTo is null) and (u.maritalStatus in (:maritalStatus) or coalesce(:maritalStatus, null) is null)" +
"and (u.appearanceAndCharacter.figure in (:figure) or coalesce(:figure, null) is null ) " +
"and (u.appearanceAndCharacter.height > :heightFrom or :heightFrom is null) " +
"and (u.appearanceAndCharacter.height < :heightTo or :heightTo is null)" +
"and (u.appearanceAndCharacter.hairColor in (:hairColor) or coalesce(:hairColor, null) is null)" +
"and (u.appearanceAndCharacter.smoking in (:smoking) or coalesce(:smoking, null) is null)" +
"and (u.appearanceAndCharacter.alcohol in (:alcohol) or coalesce(:alcohol, null) is null)" +
"and (u.appearanceAndCharacter.children in (:children) or coalesce(:children, null) is null)" +
"and (lf in (:lookingFor) or coalesce(:lookingFor, null) is null or lf is null )")
//":lookingFor member of u.appearanceAndCharacter.lookingFor" +
//" or coalesce(:lookingFor, null) is null)")
public Set<User> getUsers(@Param("sex") String sex, @Param("ageFrom") Date ageFrom, @Param("ageTo") Date ageTo,
@Param("maritalStatus") List<MaritalStatus> maritalStatuses, @Param("figure")List<Figure> figures,
@Param("heightFrom") Integer heightFrom, @Param("heightTo") Integer heightTo,
@Param("hairColor") List<HairColor> hairColors, @Param("smoking")List<Smoking> smokings,
@Param("alcohol") List<Alcohol> alcohol, @Param("children") List<Children> children,
@Param("lookingFor") List<LookingFor> lookingFor);
...
}
Я хочу иметь возможностьискать в каждом поле, ни в одном, в выбранном, так что любой элемент, один или несколько, может быть сопоставлен с LookingFor.У меня нет никаких идей, как это сделать.Я просто подумал, что добавлю if в сервисе, вызывающем этот метод, и если значение равно null, вызову тот же запрос, но без этого поля.