gpt4 book ai didi

java - Hibernate:动态连接多个表

转载 作者:行者123 更新时间:2023-12-02 05:18:17 26 4
gpt4 key购买 nike

我是 Hibernate 新手,我正在尝试动态连接更多表。我构建了一个包含三个表的示例:员工、地址、国家/地区。我想检索某个国家的所有员工。这是我的配置文件:

 <class entity-name="Employee">
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>

<many-to-one name="address" column="address" unique="true"
class="Address" not-null="true"/>
</class>

<class entity-name="Address">
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="street" column="street_name" type="string"/>
<property name="city" column="city_name" type="string"/>
<property name="state" column="state_name" type="string"/>
<property name="zipcode" column="zipcode" type="string"/>

<many-to-one name="country" column="country" unique="true"
class="Country" not-null="true"/>
</class>

<class entity-name="Country">
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="name" column="name" type="string"/>
<property name="code" column="code" type="string"/>
</class>

如果我这样做

 List employees = session.createCriteria("Employee")
.createCriteria("address")
.createCriteria("country")
.add(Restrictions.eq("code","IT"))
.list();

我得到了正确的结果,但我的目标不是手动指定启动表和过滤表之间的整个路径:我希望 hibernate 为我完成这项工作。我想写这样的东西:

  List employees = session.createCriteria("Employee")
.createCriteria("country")
.add(Restrictions.eq("code","IT"))
.list();

但我收到错误消息

org.hibernate.QueryException: could not resolve property: country of: Employee

最佳答案

Hibernate 只是一个隐藏 SQL 表达式的包装器或抽象层。

在您的工作示例中,Hibernate 构建了一个 SQL select 语句,创建了一个双 JOIN 并返回所需的输出。您正在向 Hibernate 提供如何过滤关联表的“知识”。与您编写自己的 SQL 语句相同。

但是在第二个示例中,您希望 Hibernate 从第一个表中猜测第二级关联。 Hibernate 只是查找表 Employee 是否有列/外键国家/地区,但找不到它。所以错误是:无法解析属性:国家/地区:员工

您不能指望 Hibernate 能够实现这种魔力,因为它会产生或各种错误查询。

只是为了说明你的例子。

如果您的员工有两个地址类型字段:

<class entity-name="Employee">
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>

<many-to-one name="bussiness_address" column="bussiness_address" unique="true"
class="Address" not-null="true"/>
<many-to-one name="home_address" column="home_address" unique="true"
class="Address" not-null="true"/>
</class>

两者都会链接一个国家/地区...如果出现此查询,hibernate 应该做什么?

List employees = session.createCriteria("Employee")
.createCriteria("country")
.add(Restrictions.eq("code","IT"))
.list();

家庭公司地址或两者过滤国家/地区?或者想象一下您通过每个表中存在的 id 字段进行过滤的情况。

总而言之:Hibernate 无法发挥魔法,它只是用来隐藏原始 SQL。

关于java - Hibernate:动态连接多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26716246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com