有没有办法 return org.springframework.data.jpa.domain.Specification 的父实体规范?
Is there a way to return Specifications for Parent Entity for org.springframework.data.jpa.domain.Specification?
假设我与 Person 实体存在双向 1-1 关联
@Entity
public class Person {
@OneToOne(optional=false)
@JoinColumn(name = "contact_id")
private Contact contact;
// getters/setters/constructors
}
以及联系人实体
@Entity
public class Contact {
@OneToOne(mappedBy="contact")
private Person person;
// getters/setters/
}
我找不到使用联系人实体 select 个人实体父对象的方法。像这样...
criteriaQuery.select(root.get(Contact_.person));
我收到这个错误:
不兼容的类型。必选 的捕获,但是 'get' 被推断为 Path:不存在类型变量的实例,因此 Person 符合捕获 ?
有办法吗?我想 return 使用联系人根的个人实体谓词。例如
public static Specification<Person> phoneWithCountryCode(String countryCode) {
return new Specification<Person>() {
@Override
public Predicate toPredicate(
Root<Contact> root,
CriteriaQuery<?> criteriaQuery,
CriteriaBuilder criteriaBuilder
) {
String startsWithPattern = countryCode + "%";
criteriaQuery.select(root.get(Contact_.person));
return criteriaBuilder.like(
root.get(Contact_.phone), startsWithPattern
);
}
};
}
是的,你可以做到。
我 it.I 有关系(书 -- 评论)。
在您的情况下创建 Specification<Person>
并使用 join with contact。
像这样,
Join joins = root.join("contact");
如果需要帮助,请按照我的代码进行操作。
public class BookSpecification {
public static Specification<Book> getBookByNameAndReviewId(){
return new Specification<Book> () {
@Override
public Predicate toPredicate(Root<Book> root, CriteriaQuery<?> query, CriteriaBuilder cb)
{
//List<javax.persistence.criteria.Predicate>
List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.equal(root.get("name"), "spring boot"));
Join joins = root.join("reviews");
predicates.add(cb.equal(joins.get("no") , 584));
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
// return cb.equal(root, predicates);
}
};
}
}
假设我与 Person 实体存在双向 1-1 关联
@Entity
public class Person {
@OneToOne(optional=false)
@JoinColumn(name = "contact_id")
private Contact contact;
// getters/setters/constructors
}
以及联系人实体
@Entity
public class Contact {
@OneToOne(mappedBy="contact")
private Person person;
// getters/setters/
}
我找不到使用联系人实体 select 个人实体父对象的方法。像这样...
criteriaQuery.select(root.get(Contact_.person));
我收到这个错误:
不兼容的类型。必选 的捕获,但是 'get' 被推断为 Path
有办法吗?我想 return 使用联系人根的个人实体谓词。例如
public static Specification<Person> phoneWithCountryCode(String countryCode) {
return new Specification<Person>() {
@Override
public Predicate toPredicate(
Root<Contact> root,
CriteriaQuery<?> criteriaQuery,
CriteriaBuilder criteriaBuilder
) {
String startsWithPattern = countryCode + "%";
criteriaQuery.select(root.get(Contact_.person));
return criteriaBuilder.like(
root.get(Contact_.phone), startsWithPattern
);
}
};
}
是的,你可以做到。 我 it.I 有关系(书 -- 评论)。
在您的情况下创建 Specification<Person>
并使用 join with contact。
像这样,
Join joins = root.join("contact");
如果需要帮助,请按照我的代码进行操作。
public class BookSpecification {
public static Specification<Book> getBookByNameAndReviewId(){
return new Specification<Book> () {
@Override
public Predicate toPredicate(Root<Book> root, CriteriaQuery<?> query, CriteriaBuilder cb)
{
//List<javax.persistence.criteria.Predicate>
List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.equal(root.get("name"), "spring boot"));
Join joins = root.join("reviews");
predicates.add(cb.equal(joins.get("no") , 584));
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
// return cb.equal(root, predicates);
}
};
}
}