如何在hibernate中实现对两个表的查询数据?

Posted

技术标签:

【中文标题】如何在hibernate中实现对两个表的查询数据?【英文标题】:how to implement query data on two tables in hibernate? 【发布时间】:2012-06-15 02:48:24 【问题描述】:

如何在hibernate中实现这个查询?

select tab1.name from table1 tab1, table2 tab2 where table1.id = table2.id

【问题讨论】:

要回答这个问题,我们需要查看映射 table1 和 table2 的实体。 映射这些表的实体是什么?你试过什么?您在 Hibernate 文档中不了解什么? docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/… table1 包含列 id、code 和 table2 包含 id、name、repadd、repag。我需要从 table2 中选择所有 id 匹配的数据。 【参考方案1】:

我想这会对你有所帮助。

Criteria criteria = session.createCriteria(table1.class);
criteria.setFetchMode("table2", FetchMode.JOIN).add(Restrictions.eq("id", 2));
ProjectionList proList = Projections.projectionList();
proList.add(Projections.property("name"), name);
criteria.setProjection(proList);
List list = criteria.list();

【讨论】:

【参考方案2】:

你必须像使用投影 api

Criteria criteria = session.createCriteria(table1.class);
criteria.setFetchMode("table2", FetchMode.JOIN).add(Restrictions.eq("id", 2));
ProjectionList proList = Projections.projectionList();
proList.add(Projections.property("name"), name);
criteria.setProjection(proList);
List list = criteria.list();

上面的例子中也没有使用别名,但是你可以使用别名,使用起来非常简单。

【讨论】:

嘿迪帕克,感谢您的回复。但是我的 table1.hbm.xml 和 table2.hbm.xml 是什么?我是否在 table2.hbm.xml 的 table1.hbm.xml 文件中保留任何额外的配置? 我不知道你在 hbm 文件中做了什么,但是我认为不需要在 hbm 文件中更改/添加任何配置。 另外,如果您参考 Johanna 的解决方案,那么您必须在 hbm 文件中更改或添加一些配置。我只想说..你在hibernate中的查询有很多解决方案。 谢谢我已经实现了,但还有一个问题是当我尝试遍历列表时。 [Ljava.lang.Object;不能投到 table1..你能帮帮我吗? 试试这个,List list = (table1) criteria.list();如果它仍然给出相同的异常,您也可以尝试使用 table2 进行投射... List list = (table2) criteria.list();【参考方案3】:

很好的解决方案:

两个表之间存在关系。这种关系是一对一、一对多、多对一或多对多。在您的映射中创建此关系。例如,如果 table2 是 table1 的子级,则在 table1 类和映射中,您创建具有上述关系之一的属性,您仅使用 HQL 语句“from table1”加载 table1(带有可选的 where 条件;也可以选择您可以指定两个表之间的内连接),并且您可以使用table1.getTable2()(1:1 或 n:1 关系)或table1.getTable2List()(1:n 或 n:m 关系)访问 table2。

草率的解决方案(但如果仅在特殊情况下使用 select 绝对可以):

在 HQL 中执行 select table1.col1, table1.col2, table2.col1 from table1 inner join table2 where ... 并评估对象数组列表,或者执行 select new Tabble1Table2Pojo(table1.col1, table1.col2, table2.col1) from table1 inner join table2 where ... 并评估 Tabble1Table2Pojo 列表。

【讨论】:

谢谢约翰娜。但我有一个疑问,我的 hbm 文件是什么样的?你能提供table1.hbm.xml和table2.hbm.xml代码sn-p吗? 看看这里:docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/…里面也有很多例子。

以上是关于如何在hibernate中实现对两个表的查询数据?的主要内容,如果未能解决你的问题,请参考以下文章

lua中实现对一个表的监控

如何在 R Shiny 中实现对数据表的内联编辑

MySQL数据库中实现对中文字段按照首字字母排序

如何在 Postgresql 中实现对复杂嵌套 JSONB 的全文搜索

如何在R中实现对空间面板数据的LM检验

php 如何在HTML页面中实现对数据库表数据的增删改查