具有Hibernate联接表的条件

具有Hibernate联接表的条件,hibernate,hibernate-criteria,Hibernate,Hibernate Criteria,我正在使用HibernateTemplate.findByCriteria方法进行一些查询。现在我想在标准上创建一些SQL限制,比如 criteria.add(Restrictions.sqlRestriction("name like '%abc%'") 问题是,我试图获取一个对象类A,它与类B的对象有关系,并且两个类都有一个名为“name”(或“id”或…)的字段,因此hibernate引擎对具有重复列名的表进行联接。如何根据对象类型指定限制 我尝试过{classA.name}和类似的变体

我正在使用HibernateTemplate.findByCriteria方法进行一些查询。现在我想在标准上创建一些SQL限制,比如

criteria.add(Restrictions.sqlRestriction("name like '%abc%'")
问题是,我试图获取一个对象类A,它与类B的对象有关系,并且两个类都有一个名为“name”(或“id”或…)的字段,因此hibernate引擎对具有重复列名的表进行联接。如何根据对象类型指定限制

我尝试过{classA.name}和类似的变体,但遇到了一个“不明确的列名”异常

示例(其中criterion是一个限制数组。sqlRestriction()):

final DetachedCriteria=DetachedCriteria.forClass(objectClass);
criteria.setResultTransformer(criteria.DISTINCT\u ROOT\u实体);
用于(标准:标准){
标准。添加(标准);
}
List results=template.findByCriteria(criteria、firstResult、maxResults);

您需要创建一个联接,例如,为了能够访问用户的字段:

String username ="spnbldk";
criteria.createAlias("user", "u");
criteria.add(Restrictions.eq("u.name", username);
有关更多信息,请查看以下方法:

public class TaskDAO {

    public List<Task> findByCriteria(Map<String,String> aliasMap, List<Criterion> list) throws Exception {

                Criteria criteria = getSession().createCriteria(task.class);
                Iterator<Entry<String, String>> it = aliasMap.entrySet().iterator();
                while (it.hasNext()) {
                    Entry<String, String> pairs = it.next();
                    criteria.createAlias(pairs.getKey(), pairs.getValue());
                }
                for (Criterion criterion : list)
                    criteria.add(criterion);

                return criteria.list();
    }
}

你为类创建了别名吗?你能显示代码吗?我还没有创建别名。现在我试着用它,但什么都做不了。别名是在标准本身(而不是在类中)上创建的,对吗?我确实使用了一些限制。比如(“item.name”、“…”)。但是我想使用Restrictions.sqlRestrictions(“item.name类似于“…”)”(或{item.name}),但仍然无法使用“column not found”。这不可能吗?这是可能的,我把它添加到了我的答案的末尾。如果我们的查询中有多个联接,并且我们想要对这两个表中的列进行sqlRestrictions呢??
public class TaskDAO {

    public List<Task> findByCriteria(Map<String,String> aliasMap, List<Criterion> list) throws Exception {

                Criteria criteria = getSession().createCriteria(task.class);
                Iterator<Entry<String, String>> it = aliasMap.entrySet().iterator();
                while (it.hasNext()) {
                    Entry<String, String> pairs = it.next();
                    criteria.createAlias(pairs.getKey(), pairs.getValue());
                }
                for (Criterion criterion : list)
                    criteria.add(criterion);

                return criteria.list();
    }
}
 public List<Task> get(String username) {
            try {
                // Manage Restrictions
                List<Criterion> list = new ArrayList<Criterion>();
                Criterion c = Restrictions.eq("u.username", username);
                list.add(c);

                Map<String,String> aliasMap = new HashMap<String, String>();
                    aliasMap.put("user", "u");


                List<Task> tasks = taskDAO.findByCriteria(aliasMap, orders);
                return tasks

            } catch (Exception e) { }
        }
Criteria criteria = session.createCriteria(Task.class);
criteria.add(Restrictions.sqlRestriction("{alias}.username like 'spn'));
List result = criteria.list();