假设我有一个像这样的数据模型(伪代码):
@Entity
Person {
@OneToMany
List<PersonAttribute> attributes;
}
@Entity
PersonAttribute {
@ManyToOne
AttributeName attributeName;
String attributeValue;
}
@Entity
AttributeName {
String name;
}
我有一个定义为Spring-Data-JPA repository的:
public interface PersonRepository extends PagingAndSortingRepository<Person, Long>, QueryDslPredicateExecutor<Person>{}
我在QueryDSL文档中看到有一种从Person到PersonAttribute的Join机制,但似乎需要访问QueryDsl查询对象,而仓库的客户端不会有该对象。
我的Predicate想要做的是查找所有具有AttributeValue(一个join)值为"blue"和AttributeName(另一个join)名称为"eyecolor"的人。我不确定如何使用any()
来实现,以确保仅获取具有eye_color=blue而非shoe_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()
,它将匹配任何具有属性值“blue”和任何具有“眼睛颜色”属性的内容,无论其颜色如何。 我该如何使这些条件适用于集合内相同的属性?