Hibernate标准,使用关联通过限制返回结果

时间:2017-04-22 09:19:21

标签: java hibernate hibernate-criteria

大家好我在Customer实体中有这个映射:

@OneToOne(cascade={javax.persistence.CascadeType.ALL})
@JoinColumn(name="address")
private Address address;

然后我在DAO课程中使用了这个方法:

@SuppressWarnings("unchecked")
public List<Customer> getCustomersFromThisAddress() throws Exception{
    sessao = null;
    try{
        sessao = HibernateUtil.getSessionFactory().openSession();
        Customer customer= new Customer();

        Criteria criteria = sessao.createCriteria(customer.getClass())
                    .createAlias("address", "a")
                        .add(Restrictions.ilike("a.area", "bedford"));
        return (List<Customer>) criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
    } catch (Exception e) {
        return null;
    } finally {
        sessao.close();
    }
}

我想从贝德福德地区返回所有客户......我是Hibernate和Criteria的新手,请帮忙。

2 个答案:

答案 0 :(得分:1)

使用ilike时,您必须记住两件事:

a)底层数据库必须能够支持它或具有等效功能。

b)如果没有为第二个参数指定MatchMode或添加%符号,那么您的语句只是不区分大小写的等号。

因此,如果您要搜索仅包含bedford字符串的文本,请使用以下其中一项:

.add(Restrictions.ilike("a.area", "%bedford%"));

.add(Restrictions.ilike("a.area", "bedford", MatchMode.ANYWHERE));

答案 1 :(得分:0)

我得到一个空列表&#39; []&#39;我意识到我在.add(限制......行)中犯了一个错误! &#39;区域&#39;地址表中的列数据全部记录为&#39;贝德福德&#39; ..

阅读本文后:https://www.tutorialspoint.com/hibernate/hibernate_criteria_queries.htm

我发现我只需要改变

Criteria criteria = sessao.createCriteria(customer.getClass())
                .createAlias("address", "a")
                    .add(Restrictions.ilike("a.area", "bedford"));

Criteria criteria = sessao.createCriteria(customer.getClass())
                .createAlias("address", "a")
                    .add(Restrictions.like("a.area", "bedford"));

返回我的清单...希望这会有助于其他人!!