2013-01-12 14 views
8

Mam wymóg pobierania wybranych wierszy z bazy danych Oracle na podstawie ids dostarczonych jako tablica, podobnie jak zapytanie SELECT ... FROM table_name WHERE id IN().Jak korzystać z metody setParameterList() w trybie hibernacji?

W moich próbach zrobić, próbuję użyć metody org.hibernate.setParameterList(String name, Object[] values) w moim DAO w następujący sposób.

@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(); 
    } 
} 

Parametr typu String[] w danej metody dostarczane z danej klasy regulatora wiosny.

Powoduje wywołanie następującego wyjątku.

org.hibernate.hql.ast.QuerySyntaxException: nieoczekiwany znak: koło wierszu 1, kolumnie 78 [wybrać prodImageId, prodImage z model.ProductImage gdzie prodImageId =: id0_,: id1_,: id2_,: id3_, : id4_,: id5_]

Jaki jest sposób, aby pobrać wybrane wiersze na podstawie listy ids wykorzystaniem Hibernate?

Odpowiedz

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); 

Zakładając accountFilter jest List przedmiot. Należy pamiętać, że nie należy przekazywać pustych list, ponieważ spowodowałoby to następujące SQL (który nie będzie działać): ... WHERE xyz IN() ... (uwaga pusta in-klauzula).

+0

Tak moja składnia HQL mylił . Zastąpienie 'where prodImageId =: id' z' where prodImageId in (: id) 'zadziałało. – Tiny

+6

Ostatnie zapytanie powinno być 'query.setParameterList (" accountIds ", accountFilter);', nie? –

+0

Fukuzawa ma rację, powinno być query.setParameterList ("accountIds", accountFilter), proszę zaktualizować odpowiedź – UCJava

3

Problem, że większość ludzi tutaj jest to, że nadal chcesz używać,

query.setParameter("accountIds", accountFilter); 

zamiast

query.setParameterList("accountIds", accountFilter); 

użytku setParameterList() gdy ma do czynienia z listami

+0

jak ustawić ciąg [] jako parametr zapytania – priyadarshini

Powiązane problemy