gpt4 book ai didi

hibernate - JPA Criteria API where subclass - 出现错误 : Unable to resolve attribute [lastName] against path [null]

转载 作者:行者123 更新时间:2023-12-02 09:13:45 25 4
gpt4 key购买 nike

我在编写条件查询时遇到以下问题我正在使用 Hibernate JPA 2.0,我正在尝试创建一个条件查询来获取债务

DebtHolder 是一个连接表债务(1)-->(N)债务持有人(N)-->(1)一方

Party 有两个子类 Person 和 Org

人有属性姓氏

当我在 lastName 上尝试 where 子句时,出现错误“java.lang.IllegalArgumentException:无法根据路径 [null] 解析属性 [lastName]”

这是进行查询的方法:

  public List<Debt> searchByDebtNumber(String debtNumber, String taxId, String lastName, String phoneNumber, String address, String zip, String state) {

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Debt> c = cb.createQuery(Debt.class);
Root<Debt> debt = c.from(Debt.class);
Join debtHolders = (Join)debt.fetch("debtHolders", JoinType.LEFT);
Join debtor = (Join)debtHolders.fetch("debtor", JoinType.LEFT);
c.select(debt);
c.distinct(true);


List<Predicate> criteria = new ArrayList<Predicate>();
if (debtNumber != null) {
ParameterExpression<String> p = cb.parameter(String.class, "debtNumber");
criteria.add(cb.equal(debt.get("debtNumber"), p));
}

if (taxId != null) {
ParameterExpression<String> p = cb.parameter(String.class, "taxId");
criteria.add(cb.equal(debtor.get("taxId"), p));
}

if (lastName != null) {

ParameterExpression<String> p = cb.parameter(String.class, "lastName");
criteria.add(cb.equal(debtor.get("lastName"), p));
}


if (criteria.size() == 0) {
throw new RuntimeException("no criteria");
} else if (criteria.size() == 1) {
c.where(criteria.get(0));
} else {
c.where(cb.and(criteria.toArray(new Predicate[0])));
}


TypedQuery<Debt> q = entityManager.createQuery(c);
if (debtNumber != null) {
q.setParameter("debtNumber", debtNumber);
}

if (taxId != null) {
q.setParameter("taxId", taxId);
}
if (lastName != null) {
q.setParameter("lastName", lastName);
}

return q.getResultList();
}

这是 JPA 实体的代码

            @Entity
@Table(name = "debt")
public class Debt {

@NotNull
@Column(name = "DEBT_NUMBER", nullable = false, unique = true)
private String debtNumber;

@OneToMany(mappedBy = "debt", fetch = FetchType.LAZY)
private List<DebtHolder> debtHolders = new ArrayList<>();

}

@Entity
@Table(name = "debt_holder")
public class DebtHolder {

@ManyToOne
@NotNull
@Property
@JoinColumn(name = "DEBT_ID")
private Debt debt;

@ManyToOne(fetch = FetchType.LAZY)
@NotNull
@Property
@JoinColumn(name = "DEBTOR_ID")
private Party debtor;

}

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "PARTY")
public class Party {

@Basic
@Column(name = "TAX_ID", length = 50)
private String taxId;

}

@Entity
@Table(name = "PERSON")
public class Person extends Party {

@Basic
@NotNull
@Column(name = "LAST_NAME")
private String lastName;

}

请让我知道我缺少什么......谢谢。

最佳答案

您在 Party、Person 和 Org 之间具有继承层次结构。并且只有 Person 具有属性名称“lastName”。在您的 JPA 实体中,您指的是私有(private)当事人债务人;这意味着债务人是一方,并且其中没有姓氏。尝试使用私有(private)债务人;而不是私有(private)债务人;

关于hibernate - JPA Criteria API where subclass - 出现错误 : Unable to resolve attribute [lastName] against path [null],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18178259/

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