【问题标题】:JPA criteria query select from 3 tables based on idJPA条件查询根据id从3个表中选择
【发布时间】:2020-01-14 09:10:35
【问题描述】:

如何实现以下查询作为 JPA 条件查询: sql

SELECT 
tab1.ID,
tab1.PROJECT_ID,
tab1.EMP_ID,
tab1.MONTH_ID,
tab1.MONTH,
tab2.projectName as ProjName,
tab3.empName as EmpName,
tab1.Table1
FROM 
Table1 tab1,Table2 tab2,Table3 tab3
WHERE 
Tab1.EMP_ID=tab3.ID AND tab1.PROJECT_ID=tab2.ID
I'm trying to make criteria query but I am unable to apply filters on 
that according to my requirement



CriteriaBuilder builder = em.getCriteriaBuilder();

CriteriaQuery<Object[]> criteriaQuery = 

builder.createQuery(Object[].class);

Root<Table3> tab3 = criteriaQuery.from(Table3.class);

Root<Table1> tab1 = criteriaQuery.from(Table1.class);

Root<Table2> tab2 = criteriaQuery.from(Table2.class);

Path<Object> empPath = empRoot.get("id");

criteriaQuery.where(builder.equal(projectAllocationRoot.get("empId"),
  empRoot.get("id")));

criteriaQuery.multiselect(projectAllocationRoot);
        criteriaQuery.

Entity: JPA criteria query select from 3 tables based on id

 Table 1 
 long id ;
 @OneToMany
 Tanle2 projectId ; 
 @OneToMany   
 Table3 empId; 

JPA 条件查询根据 id 从 3 个表中选择 表 2 长身份证; 长 bpId ; 字符串项目名称;


JPA 条件查询根据 id 从 3 个表中选择 表3 长身份证; 字符串雇员姓名; 字符串联系人号码;

【问题讨论】:

  • 你能分享你的实体吗?了解他们的关系类型?
  • 我想加入没有映射关联的表
  • 你能说出你的最终目标吗? IE。为什么要将它作为 Criteria 查询?
  • @konstantinTriger 如果您有任何其他替代方案,则无需仅使用 Criteria 查询,请建议

标签: hibernate jpa-2.0 hibernate-criteria


【解决方案1】:

你可以用FluentJPA实现任何SQL,例如:

FluentQuery query = FluentJPA.SQL((Table1 t1,
                                   Table2 t2,
                                   Table3 t3) -> {
    SELECT(t1.getId(), t1.getProjectId(), t1.getEmpId(),
           alias(t2.getProjectName(), MultiTab::getProjectName), t3.getEmpName());

    FROM(t1, t2, t3);
    WHERE(t1.getEmpId() == t3.getId() && t1.getProjectId() == t2.getId());
});

query.createQuery(em, MultiTab.class).getResultList();

产生以下 SQL:

SELECT t0.id, t0.project_id, t0.emp_id, t1.projectName AS projName, t2.empName 
FROM tab1 t0, tab2 t1, tab3 t2 
WHERE ((t0.emp_id = t2.id) AND (t0.project_id = t1.id))

声明的投影类:

@Tuple
@Data // lombok
public class MultiTab {
    long id;
    long projectId;
    long empId;
    @Column(name = "projName")
    String projectName;
    @Column(name = "empName")
    String empName;
}

【讨论】:

  • 感谢您的建议,但我们不能在我们的项目中使用 FluentJPA。如果您有任何其他选择,请提前告诉我谢谢..
  • @GauravJeswani 我在实体之间建立了关系
猜你喜欢
  • 1970-01-01
  • 2016-01-23
  • 2015-05-26
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多