通过传递不同类型的参数来实现Hibernate

时间:2015-07-20 15:23:34

标签: java hibernate

所以我可以通过Hibernate传递公司ID来获取公司信息,代码如下:

public Company getCompanyById(Integer companyId) {
    Company company = (Company) getCurrentSession().get(Company.class, companyId);
    return company;
}

现在我要做的是传递公司名称,地址和手机号码以获得公司。我心中的方法是这样的:

 public Company getCompanyByNameAddressCellphone(String companyName, String address, Integer cellPhoneNumber);

如何实施?

2 个答案:

答案 0 :(得分:1)

您可以使用Hibernate Criteria来实现此目的。它看起来像是:

public Company getCompanyByNameAddressCellphone(String companyName, String address, Integer cellPhoneNumber) {
    Criteria criteria = getCurrentSession().createCriteria(Company.class);
    criteria.add(Restrictions.eq("companyName", companyName));
    criteria.add(Restrictions.eq("address", address));
    criteria.add(Restrictions.eq("cellPhoneNumber", cellPhoneNumber));
    return criteria.uniqueResult();
}

在这种情况下,提供给Restrictions#eq调用的字符串值是公司实体的属性名称。

如果您不想匹配确切的字符串值并希望使用like,则可以使用Restrictions#likeRestrictions#ilike(不区分大小写的版本)。

答案 1 :(得分:1)

您可以使用Criteria / DetachedCriteria或HQL。可以从会话中检索Criteria实例或Query实例(在您的示例中由相同的getCurrentSession()调用引用)。

不确定您正在使用哪种版本的Hibernate,但这里有关于查询的文档:https://docs.jboss.org/hibernate/core/3.3/reference/en-US/html/objectstate.html#objectstate-querying

关键点是您的属性名称(Company.name,Company.address等)用于查询而不是DB列名称,您的代码不应该知道这些名称。

我个人偏好是DetachedCriteria。与Restrictions API一起使用,您可以完成大约85%的查询需求。 DetachedCriteria的执行流程略有不同,并在此处记录: https://docs.jboss.org/hibernate/core/3.3/reference/en-US/html/querycriteria.html#querycriteria-detachedqueries