我想创建一个用于连接三个表的条件构建器查询。 我已经研究了互联网,但是三个表连接的所有示例都具有与我想要的关系不同的关系。 因此,我有三个具有以下结构的表:

并且实体如下:

@Entity

@Table(name = "DEPARTMENT")

@Data

public class Department {

@Id

@GeneratedValue(generator = "uuid")

@Column(unique = true, length = 36)

private String id;

@NotNull

@Column(name = "NAME")

private String name;

@ManyToOne(fetch = FetchType.EAGER)

@JoinColumn(name = "HEAD_ID")

private Head head;

}

@Entity

@Table(name = "EMPLOYEES")

@Data

public class Employees {

@Id

@GeneratedValue(generator = "uuid")

@Column(unique = true, length = 36)

private String id;

@NotNull

@Column(name = "EMP_NAME")

private String empName;

@Column(name = "RESUME")//clob

private String resume;

@ManyToOne(fetch = FetchType.EAGER)

@JoinColumn(name = "DEPT_ID")

private Department department;

}

@Entity

@Table(name = "CONTACT")

@Data

public class Contact {

@Id

@GeneratedValue(generator = "uuid")

@Column(unique = true, length = 36)

private String id;

@NotNull

@Column(name = "NUMBER")

private Long number;

@NotNull

@Column(name = "CITY")

private String city;

@Column(name = "ADDRESS")//clob

private String address;

@OneToOne(fetch = FetchType.EAGER)

@JoinColumn(name = "DEPT_ID")

private Department department;

}

现在我想

获取部门联系人,该部门的联系人当前在ID为1234的标题下发布了名为Mike的员工。

我已经尝试了以下查询

CriteriaBuilder builder = getCriteriaBuilder();

CriteriaQuery criteria = builder.createQuery(Contact.class);

Root contactRoot = criteria.from(Contact.class);

Root employeesRoot = criteria.from(Employees.class);

//Join employeesDepartmentJoin = contactRoot.join("department", JoinType.INNER); With this statement#: Throws java.lang.IllegalArgumentException: Unable to locate Attribute with the the given name [empName] on this ManagedType [org.sample.something.Contact] exception.

Join employeesDepartmentJoin = employeesRoot.join("department", JoinType.INNER);

Join contactDepartmentJoin = contactRoot.join("department", JoinType.INNER);

List predicates = new ArrayList();

predicates.add(builder.equal(employeesDepartmentJoin.get("head").get("id"), headID));

predicates.add(builder.equal(employeesDepartmentJoin.getParent().get("empName"), empName));

criteria.where(builder.and((Predicate[]) predicates.toArray(new Predicate[0])));

criteria.select(contactRoot).distinct(true);

return getEm().createQuery(criteria).getResultList(); //Without statement#: Throws org.hibernate.exception.SQLGrammarException: could not extract ResultSet exception.

语法异常期间生成的休眠查询为:

select distinct contact0_.id as id1_47_, contact0_.number as number_id9_47_, contact0_.city as city10_47_, contact0_.address as address10_47_, contact0_.department_id as department11_47_

from sample.contact contact0_

inner join sample.department department2_ on contact0_.department_id=department2_.id

cross join sample.employees employees1_

inner join sample.department department3_ on employees1_.department_id=department3_.id

where department3_.head_id=? and employees1_.employee_name=?

任何可以轻描淡写的人都会有所帮助。 谢谢。

编辑:具有新字段和SQLGrammarException的StackTrace的更新的代码(仅在评估时抛出“无法定位属性..”的第一个异常,否则它将抛出相同的SQLGrammarException)

Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet

at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)

at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1514)

at org.hibernate.query.Query.getResultList(Query.java:132)

at org.hibernate.query.criteria.internal.compile.CriteriaQueryTypeQueryAdapter.getResultList(CriteriaQueryTypeQueryAdapter.java:74)

at org.sample.something.dao.ContactDAO.getContactByHeadAndEmployeeName(ContactDAO.java:102)

... 61 common frames omitted

Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet

at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63)

at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)

at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)

at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)

at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:69)

at org.hibernate.loader.Loader.getResultSet(Loader.java:2167)

at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1930)

at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1892)

at org.hibernate.loader.Loader.doQuery(Loader.java:937)

at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:340)

at org.hibernate.loader.Loader.doList(Loader.java:2689)

at org.hibernate.loader.Loader.doList(Loader.java:2672)

at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2506)

at org.hibernate.loader.Loader.list(Loader.java:2501)

at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:504)

at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:395)

at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:220)

at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1508)

at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1537)

at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1505)

... 64 common frames omitted

Caused by: java.sql.SQLSyntaxErrorException: ORA-00932: inconsistent datatypes: expected - got CLOB

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399)

at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1017)

at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:655)

at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:249)

at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:566)

at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:215)

at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:58)

at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:776)

at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:897)

at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1034)

at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3820)

at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3867)

at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1502)

at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52)

at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java)

java多表查询实体接收_java - 如何创建Criteria Builder查询以连接具有一对一和多对一实体关系的三个表? - 堆栈内存溢出...相关推荐

  1. java 分页 不 排序_java - 我应该如何将未分页但已排序的Pageable传递给Spring JPA存储库? - 堆栈内存溢出...

    现在,我实现了自己的Pageable类,如下所示: import org.springframework.data.domain.Pageable; import org.springframewor ...

  2. java定义三角类_Java先创建一个point类然后定义trianglete类,在trianglete类中定义三个point的实体表示三角形的三个点。...

    Java先创建一个point类然后定义trianglete类,在trianglete类中定义三个point的实体表示三角形的三个点. 关注:197  答案:1  mip版 解决时间 2021-01-3 ...

  3. eclipse占用内存过大_Java性能调优学习(三)-jmap+mat分析内存溢出问题实战

    上一节我们讲了jinfo,jstat,jmap的使用,还简单的讲了下如何使用jmap导出内存映像文件,这次,我们来实战一把内存溢出问题. 环境准备 首先我们先模拟一下内存溢出的场景,以下这段代码在访问 ...

  4. java web空指针,java - Web服务中的Java空指针异常@autowired [重复] - 堆栈内存溢出

    错误:domain.SpeakerRecog.test上的java.lang.NullPointerException SpeakerMapper为null, speakermapper.insert ...

  5. java 查询sql语句_java执行SQL语句实现查询的通用方法详解

    完成sql查询 并将查询结果放入vector容器,以便其他程序使用 /* * 执行sql查询语句 */ public static vector executequery(class clazz, s ...

  6. java从mysql中查数据_java怎么从数据库中查询数据并输出

    try { //这里的是MYSQL 举例 //加载驱动 Class.forName("com.mysql.jdbc.Driver"); //创建数据库连接 Connection c ...

  7. java递归实现 堆的删除_java 递归实现删除或查询指定目录下的全部文件

    /** * 递归列举盘符下的全部文件的名称,如E:\HeartIsland * * @author HeartIsland * */ public class FileListDemo { /** * ...

  8. java从端口接收数据_java - Java中通过串行端口接收数据的效率更高 - 堆栈内存溢出...

    这是代码片段 我在这里启动一个动作监听器 try { port_seleted.addEventListener(this); } catch (TooManyListenersException e ...

  9. java中string类型如何接收_java中的string类型全面解析

    1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...

最新文章

  1. .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  2. 排序算法复习之一趟快速排序算法:为什么说关键字所占的位置是多余的
  3. 自学python找工作工资-大四应届毕业生,学了两个月Python,找工作感觉好难啊?...
  4. APACHE如何里一个站点绑定多个域名?用ServerAlias
  5. 《爱上统计学》读书笔记
  6. Python的re.match()和re.search()的使用和区别
  7. cannot find output in imported module librosa报错解决
  8. netbeans打包java程序,并包含外部jar包
  9. PowerDesigner--comment和name互相复制
  10. 南阳oj 814 又见拦截导弹
  11. 智力与联系能力的关系
  12. Easyui三级目录菜单+手风琴+spring mvc
  13. iMindMap手绘思维导图软件免费版
  14. 封神:人在朝歌,皇宫签到六十年
  15. php接入支付宝app支付接口,php支付宝App支付生成预支付订单(统一下单接口)
  16. 衡量一个社交类APP的指标有哪些
  17. svn 撤销已经add的文件
  18. 期货成交量与持仓量(期货成交量与持仓量的秘密)
  19. 四旋翼自主飞行器探测跟踪系统补充
  20. 日志易之AIX、HP-UNIX小机探针Agent安装步骤

热门文章

  1. VisualStudio opencv配置
  2. C语言visual studio警告:取消对NULL指针“p”的引用
  3. numpy np.matmul()(两个数组的矩阵乘积)
  4. Intel Realsense D435 当摄像头运行过程中突然USB线断开,对RuntimeError: Frame didn't arrived within 5000的异常捕获及处理
  5. PyQt4编程之模态与非模态对话框(一)
  6. 华为鸿蒙系统可以用在哪里,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...
  7. linux安装mysql 5.7_linux安装mysql5.7
  8. 「后端小伙伴来学前端了」CSS3伪元素选择器 ::before ::after | 记录自己的前端学习日子
  9. 银河麒麟更换源及离线下载deb
  10. markdown语法十步学习 图文并茂