2016-05-18 4 views
0

Ich lese einige informative Beiträge wie this und this, aber ich bin immer noch verwirrt.Rufen Sie eine Karte <String,<T>> aus einer Tabelle

Hibernate Version ist 4.3.11 Der MySQL-Konto Tabelle ist:

Field   Type   Null Key 
Id    int(11)   NO  PRI 
Reference  varchar(20)  NO  UNI  
Balance   decimal(10,5) NO   
Currency  varchar(3)  NO   
Valid   tinyint(1)  NO   
Type   varchar(20)  YES   

Die AccountDaoImpl Methode:

@Override 

Akzeptiert eine Sammlung von gültigen Konto Referenzen @param accountReferences @ return A java.util.Map mit Kontoverweis als Schlüssel und die Account-Entität als Wert @throws DaoExce ption

public Map<String, Account> getAccountsByReferences(Collection<String> accountReferences) throws DaoException { 
     // TODO Auto-generated method stub 

     if (accountReferences == null || accountReferences.isEmpty()) { 
      return null; 
     } 

     if (accountReferences.size() > Constants.MAX_ACCOUNTS_SIMULT) { 
      throw new DaoException("Please query " + Constants.MAX_ACCOUNTS_SIMULT + " at a time"); 
     } 

     String accountByRefSQL = "SELECT new map(acc.reference,acc) FROM Account acc WHERE acc.reference IN (:accountReferences)"; 

     Session session = null; 
     try { 
      session = HibernateUtil.getSessionFactory().openSession(); 

      Query query = session.createQuery(accountByRefSQL).setParameterList("accountReferences", accountReferences); 

      return findMany(query); 

     } catch (DaoException daoException) { 
      log.error("DaoException in AccountDaoImpl.findAccountByReference(...)", daoException); 
      throw daoException; 
     } catch (HibernateException e) { 
      log.error("HibernateException in AccountDaoImpl.findAccountByReference(...)", e); 
      throw new DaoException(e.getMessage()); 
     } finally { 
      session.close(); 
     } 
    } 

Die findMany() -Methode ist in der Mutter GenericDao:

public List<T> findMany(Query query) throws DaoException { 
     try { 
      List<T> t; 
      t = (List<T>) query.list(); 
      return t; 
     } catch (HibernateException hibernateExecption) { 
      log.error("Hibernate Exception in GenericHibernateDaoImpl.findMany(...)", hibernateExecption); 
      throw new DaoException(hibernateExecption.getMessage()); 
     } catch (RuntimeException runtimeException) { 
      log.error("RuntimeException in GenericHibernateDaoImpl.findMany(...)", runtimeException); 
      throw new DaoException(runtimeException.getMessage()); 
     } 

    } 

Es gibt zwei Fragen:

  1. sich nach den Fäden bereits erwähnt, ist der Anruf richtig (I weiß nicht, wie!)
  2. Die Threads angeben, dass die Abfrage zurückgegeben wird, wird eine Liste der Karte zurückgeben - ich verstehe nicht dies

Antwort

0

Ich bekam die Antwort von this forum thread.

Sie versuchen, eine Liste in eine Karte zu konvertieren. Check out the map() Wählen Sie Syntax. Die Map soll das ResultSet umbrechen, aber die Abfrage gibt eine Liste zurück.

Ich schlage vor, Sie eine Liste zurück und dann erstellen Sie die Karte mit einer einfachen Iteration.

Verwandte Themen