Hibernate Criteria使用一对多关系搜索请求

时间:2014-05-18 09:36:59

标签: java hibernate one-to-many criteria hibernate-criteria

我试过这样做:

session = HibernateUtil.getSessionFactory().openSession();
Criteria cr = session.createCriteria(Car.class);
cr.createAlias("vendor", "vendor"); 

cr.add( Restrictions.eq("vendor.name", input));

results = (List<Car>) cr.list();

还喜欢:

session = HibernateUtil.getSessionFactory().openSession();
Criteria cr = session.createCriteria(Car.class);
cr.createCriteria("vendor").add(Restrictions.eq("name", input));

results = (List<Car>) cr.list();

两种实现都只返回所有数据,而不是使用搜索查询指定。

在汽车课上,我有了关系:

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="id_vendor", nullable=false)
public Vendor getVendor() {
    return this.vendor;
}

此外,我还在我要搜索的name班级上找到Vendor列。

那我怎么可能做这样的搜索请求?

感谢。

2 个答案:

答案 0 :(得分:0)

您需要将标准分配回原始对象。

您获得所有汽车的原因是因为将您的供应商添加到查询中的代码行会为您创建一个新的criteria对象,然后您将不使用该对象。

变化:

session = HibernateUtil.getSessionFactory().openSession();
Criteria cr = session.createCriteria(Car.class);
cr.createCriteria("vendor").add(Restrictions.eq("name", input));  //Does nothing

results = (List<Car>) cr.list();

进入这个:

session = HibernateUtil.getSessionFactory().openSession();
Criteria cr = session.createCriteria(Car.class);
cr = cr.createCriteria("vendor").add(Restrictions.eq("name", input));

results = (List<Car>) cr.list();

它应该有用。

答案 1 :(得分:0)

如果您不会获得Car.class的唯一结果,则需要setResultTransformer

Criteria cr = session.createCriteria(Car.class);
cr.createAlias("vendor", "vendor"); 

cr.add( Restrictions.eq("vendor.name", input));
crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
results = (List<Car>) cr.list();