Допустим, у меня есть такая модель данных (псевдокод):
@Entity
Person {
@OneToMany
List<PersonAttribute> attributes;
}
@Entity
PersonAttribute {
@ManyToOne
AttributeName attributeName;
String attributeValue;
}
@Entity
AttributeName {
String name;
}
У меня есть репозиторий Spring-Data-JPA, определенный, например:
public interface PersonRepository extends PagingAndSortingRepository<Person, Long>, QueryDslPredicateExecutor<Person>{}
Я вижу в документации QueryDSL, что есть механизм для присоединения от Person к PersonAttribute, но похоже, что вам нужен доступ к объекту QueryDsl Query, которого не было бы у клиента репозитория.
Что я хотел бы сделать с моим предикатом, так это найти всех тех людей, которые имеют AttributeValue (есть одно соединение) со значением «синий» и AttributeName (есть другое соединение) с именем «цвет глаз». Я не уверен, как бы я сделал это с any()
и заставил бы меня получать только те, у кого eye_color = blue, а не те, у кого shoes_color = blue.
Я надеялся, что смогу сделать что-то вроде этого:
QPerson person = QPerson.person;
QPersonAttribute attribute = person.attributes.any();
Predicate predicate = person.name.toLowerCase().startsWith("jo")
.and(attribute.attributeName().name.toLowerCase().eq("eye color")
.and(attribute.attributeValue.toLowerCase().eq("blue")));
но с any()
там он просто соответствует чему-либо со значением атрибута «синий» и чему-либо с атрибутом «цвет глаз», независимо от цвета. Как применить эти условия к одному и тому же атрибуту в наборе?