3

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.

Moiz
  • 31
  • 1
  • 5

1 Answers1

0

You have Inheritance hierarchy among Party, Person and Org. And only Person has attribute name 'lastName'. In your JPA entities, you are referring private Party debtor; which means debtor is Party and doesn't have lastName in it. Try using private Person debtor; instead of private Party debtor;

Manjunath D R
  • 371
  • 2
  • 8