【问题标题】:jpa criteria - expression based on db field namejpa 标准 - 基于 db 字段名称的表达式
【发布时间】:2014-11-26 08:59:57
【问题描述】:

我有一个名为 User 的实体,它与名为 Company 的实体具有以下关系:

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

在我的数据库中,我有一个带有“COMPANY_ID”列的用户表。如何使用此字段创建 JPA 条件查询?

使用标准生成器,我尝试了以下表达式但没有成功:

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();

但我收到以下错误:“托管类型用户的属性 [company.id] 不存在。”

提前致谢。

【问题讨论】:

    标签: java jpa persistence criteria-api


    【解决方案1】:

    我认为您需要显式连接。

    注意我正在使用 Criteria 的元模型。

    这是我的sn-p,和你的不一样,但你可以有一个想法

        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;
    

    【讨论】:

    • 嗨 Leo,非常感谢您的及时回答。我使用以下谓词测试了您的方法:Join&lt;User, Company&gt; userCompanyJoin = mockEntityRoot.join("company"); cq.where(cb.equal(userCompanyJoin.get("id"), exampleObject.getCompany().getId()));,它有效!我也尝试了cq.where(cb.equal(mockEntityRoot.get("company").get("id"), exampleObject.getCompany().getId()));,这也有同样的成功行为。再次感谢您的帮助。
    猜你喜欢
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多