Скажем, у меня есть модель данных, как это (псевдокод):весна-данных JPA с QueryDslPredicateExecutor и присоединение в коллекцию
@Entity
Person {
@OneToMany
List<PersonAttribute> attributes;
}
@Entity
PersonAttribute {
@ManyToOne
AttributeName attributeName;
String attributeValue;
}
@Entity
AttributeName {
String name;
}
У меня есть хранилище Spring-данных JPA определено, такие как:
public interface PersonRepository extends PagingAndSortingRepository<Person, Long>, QueryDslPredicateExecutor<Person>{}
Я вижу в документации QueryDSL, что существует механизм присоединения от Person к PersonAttribute, но похоже, что вам нужен доступ к объекту QueryDsl Query, который не был бы у клиента репозитория.
То, что я хотел бы сделать с моим предикатом, - это найти всех лиц, у которых есть атрибут AttributeValue (есть одно соединение) со значением «blue» и AttributeName (есть еще одно соединение) с именем «eyecolor» , Я не уверен, как бы это сделать с any()
и обеспечить, чтобы я получал только те, у которых eye_color = синий, а не те, у которых shoe_color = синий.
Я надеялся, что я мог бы сделать что-то вроде этого:
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()
в там просто соответствует ничего со значением атрибута «синего» и что-нибудь с «цвет глаз» атрибут независимо от цвет. Как я могу применить эти условия к одному и тому же атрибуту в наборе?
Да, я это понимаю. Я пытаюсь понять, есть ли способ сделать это с QueryDslPredicateExecutor, что означало бы, что мне не нужно было бы предоставлять какую-либо реализацию, а вызывающий объект репозитория мог бы создавать более интересные запросы без необходимости открывать новый метод через апи. В любом случае, спасибо за ответ и ссылку. – digitaljoel
Я обновил свой ответ. –
Отличное обновление, спасибо, заодно. Я знал о любом, но не вижу, как присоединиться через AttributeValue в AttributeName и сопоставить их. Я обновил свой вопрос, чтобы отразить это. – digitaljoel