rbezerra
rbezerra

Reputation: 47

jpa criteria - expression based on db field name

I have an entity called User, which has the following relationship to an entity called Company:

@Entity
public class User {
...
@ManyToOne
@JoinColumn(name="COMPANY_ID",referencedColumnName="ID")
private Company company = null;
...
}

And on my database, I have a User table with a "COMPANY_ID" column. How can I create a JPA criteria query using this field?

Using a criteria builder, I've tried the following expressions without success:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery(User.class);
Root mockEntityRoot = cq.from(User.class);

//cq.where(cb.equal(mockEntityRoot.get("company"), 2));
//cq.where(cb.equal(mockEntityRoot.get("COMPANY_ID"), 12));
cq.where(cb.equal(mockEntityRoot.get("company.id"), 8));

entityManager.createQuery(cq).getResultList();

But I got the following error: "The attribute [company.id] from the managed type User is not present."

Thanks in advance.

Upvotes: 1

Views: 2511

Answers (1)

Leo
Leo

Reputation: 6580

I think you need an explicit join.

Notice I am using Criteria's metamodel.

This is a snippet I have, it's not the same thing as yours but you can have an idea

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Site> q = cb.createQuery(Site.class);
    Root<Site> e = q.from(Site.class);
    Join<Site,SiteType> siteType = e.join(Site_.siteType);

    Predicate predicate = cb.conjunction();
    Predicate p1 = cb.equal(siteType.get(SiteType_.id), selectedSiteType.getId());
    Predicate p2 = cb.equal(e.get(Site_.markedAsDeleted), false);
    predicate = cb.and(p1,p2);

    q.where(predicate);     
    q.select(e);

    TypedQuery<Site> tq = entityManager.createQuery(q);
    List<Site> all = tq.getResultList();

    return all;

Upvotes: 2

Related Questions