【问题标题】:How to write this join query with hibernate CRITERIA如何使用 hibernate CRITERIA 编写此连接查询
【发布时间】:2013-08-20 20:58:36
【问题描述】:
select ptm.* from ProofTestMaster ptm LEFT JOIN 
ProofTestApplicationMap ptam on ptm.proofTestID = ptam.proofTestID 
LEFT JOIN ProofTestComapartmentMap ptcm on ptm.proofTestID = ptcm.proofTestID 
where (ptam.applicationID = 3 and ptm.isDeleted = 0) or 
(ptcm.compartmentID = 4 and ptm.isDeleted = 0)

其中ProofTestApplicationMapProofTestComapartmentMap 是映射表,它们在java 端没有实体。

【问题讨论】:

  • 希望这个链接能帮到你:) stackoverflow.com/questions/6165743/…
  • 不,我需要使用标准 API 而不仅仅是 HQL 或 SQL。
  • 很难映射 2 个关系和 3 个表。此外,维护这样的映射确实很复杂。如果您有一对多、多对多的关系,您还需要维护延迟加载策略,这会让您的工作更加努力。在我看来,这样的映射是不必要的。
  • 使用 Criteria Object 的 createAlias 来定义连接
  • @erencan 那么您建议如何维护数据结构以使生活更轻松?

标签: java database hibernate hibernate-criteria


【解决方案1】:

为您的查询放置适当的缩进总是更好。优点是:

  • 您将轻松理解查询
  • 其他人也会很快理解。

所以我为你做了这个。现在查询看起来像:

select 
    ptm.* 
from ProofTestMaster ptm 
    LEFT JOIN ProofTestApplicationMap ptam on ptm.proofTestID = ptam.proofTestID 
    LEFT JOIN ProofTestComapartmentMap ptcm on ptm.proofTestID = ptcm.proofTestID 
where 
    (ptam.applicationID = 3 and ptm.isDeleted = 0) or 
    (ptcm.compartmentID = 4 and ptm.isDeleted = 0);

下面是 CriteriaBuilder 和静态元模型的实现:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> criteriaQuery = criteriaBuilder.createQuery(Long.class);

Root<ProofTestMaster> mainRoot = criteriaQuery.from(ProofTestMaster.class);

Join<ProofTestMaster, ProofTestApplicationMap> firstJoin = mainRoot.join(ProofTestMaster_.proofTestID, JoinType.LEFT);
Join<ProofTestMaster, ProofTestComapartmentMap> secondJoin = mainRoot.join(ProofTestMaster_.proofTestID, JoinType.LEFT);

Predicate p1 = criteriaBuilder.equal(firstJoin.get(ProofTestApplicationMap_.applicationID),3);
Predicate p2 = criteriaBuilder.equal(mainRoot.get(ProofTestMaster_.isDeleted),0);
Predicate p3 = criteriaBuilder.equal(secondJoin.get(ProofTestComapartmentMap_.compartmentID), 4);
Predicate p4 = criteriaBuilder.and(p1,p2);
Predicate p5 = criteriaBuilder.and(p3,p2);
Predicate p6 = criteriaBuilder.or(p4,p5);

criteriaQuery.where(p6);

criteriaQuery.select(criteriaBuilder.count(mainRoot));

Long count = entityManager.createQuery(criteriaQuery).getSingleResult();

如果你看到上面的代码,一共有6个Predicates,可以放入List。但为了您的理解,我保留了它。

如果对您有帮助,请告诉我。谢谢,编码愉快。

【讨论】:

  • 首先我很抱歉没有正确格式化我的查询并感谢您的解决方案。你能推荐一些静态元模型以外的东西吗?
  • 没问题。但是我可以知道为什么你不想在没有静态元模型的情况下这样做吗?使用静态元模型为您提供类型安全功能。添加静态元模型也很容易。你可以查看这篇博文:link
  • 是的,这确实是个人问题。我正在进行一个项目,而且截止日期很紧。如果我这样做,我必须在几个部分上工作,所以它会有点耗时。所以我只想节省时间。
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 2021-02-09
相关资源
最近更新 更多