I am facing the following issue while writing a criteria query I am using Hibernate JPA 2.0, I am trying to create a criteria query to get Debts
DebtHolder is a Join table Debt(1)-->(N)DebtHolders(N)-->(1)Party
Party has two subclasses Person and Org
Person has attribute lastName
When I am trying where clause on lastName I am getting the error saying "java.lang.IllegalArgumentException: Unable to resolve attribute [lastName] against path [null]"
Here is the method which is making the query:
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();
}
Here is the code for JPA entities
@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;
}
please let me know what I am missing...thanks.