首页 > 解决方案 > Java Criteria builder - 如何构建复杂的连接查询?

问题描述

我是 Criteria API 的新手(一般是 JAVA,但我们不谈这个)。我正在尝试使用它构建一个非常复杂的查询,如下所示:

 SELECT ac.firstName as firstName, ac.lastName as lastName, du.idNumber as idNumber, du.dateOfBirth as dateOfBirth, du.gender as gender, du.settlement as settlement, du.street as street, du.buildingNumber as buildingNumber, du.id as driverID, pa.phoneNumber as phoneNumber, ea.emailAddress as emailAddress
 FROM newDB.accounts ac
 inner join driver_users du on du.id = ac.id
 inner join phone_authentications pa on pa.identity_id=ac.identity_id
 inner join email_authentications ea on ea.identity_id=ac.identity_id
 where du.idNumber=:searchParams.idNumber and  emailAddress like searchParams.emailAddress

经过大量挖掘后,我设法理解了 Criteria API 的语法以及如何使用它,但我不确定有几件事:

  1. 如何让它从各种表中拉出来?我看到了您定义要从中提取的根表的“根”命令,所以我想我的情况应该是Root<DriverSearchResultDto> root = criteriaBuilder.from(DriverSearchResultDto.class);,但它真的是根吗?只是假设是因为它出现在“from”子句之后……那么内部连接呢?如何使用指定的连接条件添加它们?

  2. DriverSearchResultDto我基于标准构建器的不是实体,也不是直接连接到表,它是我创建的自定义 DTO,用于接收查询结果。可以吗?我浏览了在到达这里之前编写的其余代码,并且使用的所有标准构建器都是连接到数据库表的实际实体,所以我想确保我正确使用它(里面的字段具有完全相同的名称) - 例如名字、姓氏等)。

  3. 如何在标准中制作“喜欢”条件?也找不到很多关于此的信息。

  4. 一个关于查询的新手问题——我最近在 sql DB 上工作不多。我对语法并不陌生,但只是不确定:如您所见,我想从数据库中提取的所有参数都写得像ac.lastName as lastName- 参数本身的名称没有变化。只是以前的程序员很奇怪,还是在同时(或在其他条件下)从几个表中提取时是否有必要指定参数名称不包括表?它会不知道如何将响应解析为结果对象吗?

很多!

标签: javabackendcriteria-api

解决方案


推荐阅读