我正在使用HibernateTemplate.findByCriteria方法进行一些查询。现在我想对标准创建一些SQL限制,比如
criteria.add(Restrictions.sqlRestriction("name like '%abc%'")
问题是我正在尝试获取一个与ClassB对象有关系的对象A类,并且这两个类都有一个名为“name”(或“id”或......)的字段,所以hibernate引擎在具有重复列名的表上进行连接。如何根据对象类型指定限制?
我已经尝试了{classA.name}和类似的变体,但我得到了一个“含糊不清的列名”异常。
示例(其中标准是Restrictions.sqlRestriction()的数组):
final DetachedCriteria criteria = DetachedCriteria.forClass(objectClass);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
for(Criterion criterion : criterions) {
criteria.add(criterion);
}
List<T> results = template.findByCriteria(criteria, firstResult, maxResults);
答案 0 :(得分:3)
您需要创建一个连接,例如,为了能够访问用户的字段:
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();
}
}
然后你可以在服务类中使用它:
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) { }
}
“sqlRestriction”应该像这样工作:
Criteria criteria = session.createCriteria(Task.class);
criteria.add(Restrictions.sqlRestriction("{alias}.username like 'spn'));
List result = criteria.list();