Spring-Data-JPA with QueryDslPredicateExecutor and Join into a collection
2022-09-03 12:15:03
假设我有一个这样的数据模型(伪代码):
@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对象,而存储库的客户端不会有。
我想用我的谓词来查找所有那些具有属性值(有一个连接)且值为“blue”和属性名称(还有另一个连接)且名称为“eyecolor”的人。我不确定我该如何做到这一点,并强制我只得到那些eye_color=blue的人,而不是那些shoe_color=blue的人。any()
我希望我能做这样的事情:
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()