我正在使用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条记录,我只想要一条记录)。如何为此编写条件查询。任何人都可以帮助我。
答案 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。
通过这种方式,您可以通过只获取一个地址来获取用户。