gpt4 book ai didi

java - 带有 QueryDslPredicateExecutor 和加入集合的 Spring-Data-JPA

转载 作者:搜寻专家 更新时间:2023-10-30 21:22:12 35 4
gpt4 key购买 nike

假设我有一个这样的数据模型(伪代码):

@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 查询对象,而存储库的客户端没有。

我想用我的 Predicate 做的是找到所有具有值为“blue”的 AttributeValue(有一个连接)和名称为“eyecolor”的 AttributeName(有另一个连接)的 Persons。我不确定如何使用 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”的任何事物以及任何具有“eye color”属性的事物,而不考虑颜色。 如何使这些条件适用于集合中的相同属性?

最佳答案

您不能直接连接谓词中的列,但您可以像这样创建一个 any() 表达式

QPerson.person.attributes.any().attributeValue.eq("X")

此方法的限制是连接表达式 QPerson.person.attributes.any() 只能在一个过滤器中使用。它的好处是该表达式在内部转换为与分页不冲突的子查询。

对于多重限制,你需要像这样显式地构造一个子查询表达式

QPersonAttribute attribute = QPersonAttribute.personAttribute;
new JPASubQuery().from(attribute)
.where(attribute.in(person.attributes),
attribute.attributeName().name.toLowerCase().eq("eye color"),
attribute.attributeValue.toLowerCase().eq("blue"))
.exists()

除了 QueryDslPredicateExecutor 之外,您还可以像这样通过 Spring Data 使用 Querydsl 查询

public class CustomerRepositoryImpl
extends QuerydslRepositorySupport
implements CustomerRepositoryCustom {

public Iterable<Customer> findAllLongtermCustomersWithBirthday() {
QCustomer customer = QCustomer.customer;
return from(customer)
.where(hasBirthday().and(isLongTermCustomer()))
.list(customer);
}
}

示例取自此处 https://blog.42.nl/articles/spring-data-jpa-with-querydsl-repositories-made-easy/

关于java - 带有 QueryDslPredicateExecutor 和加入集合的 Spring-Data-JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21637636/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com