2012-07-19 60 views
2

我使用HibernateTemplate.findByCriteria方法來進行一些查詢。現在,我想創建標準SQL的一些限制,如Hibernate的條件加入表

criteria.add(Restrictions.sqlRestriction("name like '%abc%'") 

的問題是,我試圖獲取一個對象類中,有一個關於ClassB的的對象,這兩個類有一個字段命名「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); 
+1

你創建類的別名?你可以顯示代碼嗎? – 2012-07-19 14:34:28

+0

我還沒有創建別名。現在我試圖使用它,但對此無能爲力。標準本身(而不是類)創建別名,對吧? – spnbldk 2012-07-19 14:52:54

回答

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(); 
+0

我確實使它適用於Restrictions.like(「item.name」,「...」)。但是我想使用Restrictions.sqlRestrictions(「item.name like'...')(或{item.name}),並且仍然失敗並顯示」未找到列「。這不可能嗎? – spnbldk 2012-07-20 09:11:53

+0

這是可能的,我把它添加到我的答案結束。 – Ali 2012-07-20 10:37:34

+1

如果我們的查詢中有多個連接,並且我們希望在兩個表中的列上都有sqlRestrictions? – 2014-06-12 06:47:09