2013-01-12 65 views
8

我需要從Oracle數據庫中提取基於ids的選定行作爲數組,例如SELECT ... FROM table_name WHERE id IN()查詢。如何在Hibernate中使用setParameterList()方法?

在我嘗試這樣做時,我試圖在我的DAO中使用org.hibernate.setParameterList(String name, Object[] values)方法,如下所示。

@Service 
@Transactional(readOnly = true, propagation=Propagation.REQUIRES_NEW) 
public final class ProductImageDAO implements ProductImageService { 

    @SuppressWarnings("unchecked") 
    public List<Object[]> getFileName(String[] list) { 
     return sessionFactory 
       .getCurrentSession() 
       .createQuery("SELECT prodImageId, prodImage FROM ProductImage WHERE prodImageId=:list") 
       .setParameterList("list", list).list(); 
    } 
} 

給定方法中String[]類型的參數由相應的Spring控制器類提供。

它導致引發以下異常。

org.hibernate.hql.ast.QuerySyntaxException:意外的標記:,鄰近 第1行,列78從 model.ProductImage選擇prodImageId,prodImage其中prodImageId =:id0_,:id1_,:id2_,: id3_, :id4_,:id5_]

什麼是檢索基礎上使用Hibernate的ids列表中選定行的方式嗎?

回答

20
String queryString = "select acc from cgix.trust.domain.PtbnAccount as acc where acc.accountId IN (:accountdIds)"; 
Query query = session.createQuery (queryString); 
query.setParameterList("accountIds", accountFilter); 

假設accountFilterList對象。請記住,您不應該傳遞空列表,因爲這會導致以下SQL(這將不起作用):... WHERE xyz IN() ...(請注意空的in-clause)。

+0

是我的HQL語法錯了。用'where prodImageId in(:id)'工作替換'prodImageId =:id'。 – Tiny

+6

最後一個查詢應該是'query.setParameterList(「accountIds」,accountFilter);',否? –

+0

Fukuzawa是對的,應該是query.setParameterList(「accountIds」,accountFilter),請更新回答 – UCJava

3

的問題,大多數人在這裏做的是,他們還是想用,

query.setParameter("accountIds", accountFilter); 

代替

query.setParameterList("accountIds", accountFilter); 

使用setParameterList()與列表打交道時

+0

如何設置String []數組作爲查詢參數 – priyadarshini

相關問題