2016-12-27 90 views
0

我有4个表CustomerEntity,CustomerMaster,请求和UserMaster
和具有以下表的结构,如何在Hibernate中连接多个表?

CustomerEntity (id,address,branch,branch_id,city,entity_status,request_id,user_master_id) 
CustomerMaster (id,customer_name,customer_type) 
UserMaster(id,customer_master_id,employee_id,unique_id,employee_id) 
Request(id,customer_master_id,parent_request_id,request_status,user_master_id) 

当我正在做一个查询从休眠这样

sb.append("select c from CustomerEntity c, Request r ") 

它提供我正确的数据,我需要,但现在有一种情况下,我需要捕获UserMaster ID以及CustomerMaster ID值,这只能通过加入UserMaster和CustomerMaster表与现有的查询来获取,但我'我不知道我在哪里将获得所有预计的数据,如上述查询我收到'c'的数据,但在新的查询中,我希望在加入所有这4个表后执行查询中的所有值。

我使用下面的查询:

sb.append("select * from (CustomerEntity as c join Request as r 
    on r.id = c.request_id) 
    left join CustomerMaster as c1 on r.customer_master_id = c1.id 
    left join UserMaster as u 
    on r.customer_master_id = u.customer_master_id"); 
在Hibernate这样

,但它似乎没有工作。

回答

1

可以在休眠(JPA)中加入任意数量的表。应该如何返回数据取决于您的业务需求。

在你的例子中,你似乎正在利用StringBuilder/StringBuffer创建本地SQL查询,对吧?这不需要,分别。在大多数情况下没有帮助。

通常hibernate用于返回映射的实体,换句话说,表示数据库表的数据的Java对象。然后,您可以在当前持久化上下文中使用它的访问器和增变器(getter和setter)来处理这些对象,或者甚至在分离状态下使用它。

通过hibernate映射,您可以定义关系,允许您通过Java方法调用浏览图形来访问所有分配的对象。可以看看here

但是,这假定您使用ORM层的能力来访问数据,这意味着要么在Session/EntityManager对象,HQL/JPQL查询或使用Criteria API调用实体查询(访问方法)。

Thisthis应该给你进一步的信息。假设你有一个映射,它将允许它完全足以编写一个HQL查询,例如, SELECT c FROM CustomerEntity AS c这将返回一个单一的实体。通过访问器,您可以浏览图表。

也可以在HQL中编写联接,在这种情况下,您只需告知哪些实体应该加入,如SELECT c FROM CustomerEntity AS c JOIN c.request AS r ...,在常规情况下可以省略ON子句。由于映射,Hibernate知道实体是如何连接的。

当然,您的映射关于提取适量的数据(急切与懒惰)&(单向与双向)应该考虑周全。在某些情况下,编写针对您的用例的查询甚至会比通过Java方法导航以避免性能损失更好,但这是您必须根据数据结构和数据大小来决定的。

最后但并非最不重要的一点,如果您需要,也可以使用native SQL queries,但是您必须自行考虑将它映射到Java对象。