当前位置: 首页 > 知识库问答 >
问题:

JPA条件查询根据id从3个表中选择

曾元忠
2023-03-14

如何实现以下作为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个表中选择Table 2 long id; long bpId; String project Name;

JPA条件查询根据id从3个表中选择表3长id;字符串empName;字符串contactNum;

共有1个答案

王刚毅
2023-03-14

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

java prettyprint-override">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;
}
 类似资料:
  • 我是criteria api的新手,正在尝试构建一个id匹配id的select查询。 我想建立这样一个:

  • 我需要根据MS SQL Server中定义为datetime2(7)的列,查询给定日期范围内的记录列表。 从HTTP请求中,我将收到如下startDate和endDate。 在数据库中,lastUpdate列中的值存储为2021-05-31 14:12:44.8020000 我正在尝试将传入的查询参数(字符串)转换为java。sql。代码中的日期如下所示 我在这里看到的问题是,我的实际输入日期是2

  • 我有三张桌子 表A 我需要根据传递的参数将TableA连接到TableB或TableC。ie 我尝试了以下查询 但是,这是给语法错误。有人能帮忙吗? 解决方案:

  • 这是一个示例实体: 现在我创建一个条件查询,将Join作为follwing: 上面的代码可以在PosgreSQL中工作,但不能在Oracle中运行,因为它选择的acctype.name没有出现在group by子句中。 更新: 我想我的问题对你来说不清楚。我的问题不是关于中的PostgreSQL或Oracle行为。我的问题是: 我在子句中使用(这意味着我希望hibernate在中使用Account

  • 问题内容: 我有一个带有记录的表,并且有一个名为的行。我插入了太多文章,并且我只希望从每个类别中选择两篇文章。 我试图做这样的事情: 我创建了一个视图: 然后我创建了这个查询: 但这不起作用,只给我两个记录吗? 问题答案: LIMIT仅停止语句返回的结果数。您正在寻找的通常称为分析/窗口/排序功能-MySQL不支持,但您可以使用变量进行仿真: 如果不进行更改,则结果集将包含和值-如果不是这种情况,

  • 我试图从获取数据。总共有9个表格,我必须相应地从所有表格中显示产品列表。 我考虑过使用连接,并尝试了左连接,如下所示: 这里是主表,pid是从tbl2到tbl9的所有表的。 注意:这里我在所有表上使用了来避免长查询,但是在实际的数据库操作中,只提到特定的列来提高性能。 现在实际的问题是,我没有得到所有的记录从表使用左加入。只检索中对应的每个条目的最后一行。 我使用了GROUP BY来避免重复的左连