当我们选择父表时如何获取子表特定数据?

时间:2014-10-30 16:13:49

标签: hibernate

我正在使用hibernate标准,我有两个one to many关系表。这些用户地址User 一对多关系Address table.One user有3个地址,如下所示

用户

userId ---- username ----lastname 

   1  ---      balu   ---- v     

地址

AddressId -----    cityName   ------      userId


1  --            vizag    ---         1

2     ----      srikakulam  -----   1

3     ----       hyd         ----  1

但我希望结果就像我提取父对象User而不是为该用户提取所有addressList 我只想要CityName =' Hyd'地址对象(而不是为子表提取所有3条记录,我只想要一条记录)。如何为此编写条件查询。任何人都可以帮助我。

4 个答案:

答案 0 :(得分:2)

在我看来,它只能通过休眠过滤器来实现。

参见示例

实体定义

    @Entity
    @FilterDef(name = "filtAddr", parameters = {@ParamDef(name = "cityName", type = "string")})
    public class User {
        @Id
        private Long id;

        @OneToMany(mappedBy = "user" )
        @Filter(name = "filtAddr", condition = "city_name = :cityName")
        private List<Address> addresses;
    }

    @Entity
    public class Address {
        @Id
        private Long id;

        private String cityName;

        @ManyToOne
        private User user;
    }

并使用会话过滤器加载数据

Filter filter = session.enableFilter("filtAddr");
filter.setParameter("cityName", "Hyd");

List<User> users =  session.createCriteria(User.class)
        .setFetchMode("addresses", FetchMode.JOIN) //optional
        .list();

答案 1 :(得分:1)

参考你对我的问题的回答,下面是完整的情景和我给你的建议:) - &gt;

当用户从某个用户界面中选择其中一个地址时,您必须对该地址执行某些操作。

要执行此要求,您将使用条件获取用户,然后在该用户实体的地址列表中进行迭代以查找匹配项。然后对该地址执行必要的操作并保存。

我的建议:此处不是提取用户实体,您可以使用带有限制的条件直接获取地址实体(userid =&lt; UserId&gt;和地址=&lt;用户&#39; s选择&gt; ),这样你就可以直接获取地址对象并在其中执行任何必要的操作。

希望这可以提供帮助。

答案 2 :(得分:0)

从数据库返回的实体总是作为整体返回,不对数据进行任何过滤。它们代表数据库的当前状态,这意味着您将始终获得所有地址。

如果您需要特定地址,请为其编写单独的查询,或循环浏览所有用户的地址,并在单独的变量中获取所需的地址。

答案 3 :(得分:0)

通常,Criteria返回整个实体,并且没有直接的方式来选择性地获取子类

数据库/实体设计可以更明智地制作以避免此类情况。请考虑对您的示例进行略微修改:

说,有&#39; n&#39;用户可以拥有的地址数量,但可能只有一个地址可能是他的通信地址。现在的情况如下 - &gt;

用户

userId ---- username ---- lastname --- communicationAddressId

1 ---- balu ---- v --- 3

<强>地址

AddressId ----- cityName ------ userId

1 - vizag --- 1

2 ---- srikakulam ----- 1

3 ---- hyd ---- 1

在这里你可以创建一个实体,比如UserWithCommAdressOnly,在comminucationAdderessId上使用oneToOne映射,在Adderess.AdderessId上没有oneToMany Mapping。

通过这种方式,您可以通过只获取一个地址来获取用户。