2017-06-07 9 views
1

ここに私のコードを追加しました。私はテーブルのリストを取得しようとしている間、tryブロックで問題が発生します。HibernateDaoSupportを使用してデータベース内のテーブルのリストを取得する方法は?

データベースがMySql
例外:java.lang.IllegalArgumentException:通過するノードをnullにすることはできません。

public class DBOptimizationDAO extends HibernateDaoSupport { 

private static final Log log = LogFactory.getLog(DBOptimizationDAO.class); 

public void optimizeAdapter(String year) 
{ 
    List<com.ecw.adapterservice.beans.TransactionInbound> transactionInboundList = null; 
    StringBuilder queries = new StringBuilder(); 
    try {  
     transactionInboundList = (List<com.ecw.adapterservice.beans.TransactionInbound>)super.getHibernateTemplate().find("from TransactionInbound where inboundTimestamp < '" + year+ "-01-01'order by 1 desc limit 2"); 

     // Check if archive table exist or not 
     List<Object> inboundObj = getHibernateTemplate().find("SHOW TABLES LIKE transaction_outbound"); 
     List<Object> outboundObj = getHibernateTemplate().find("SHOW TABLES LIKE 'transaction_outbound_archive'"); 
+0

tryブロックで発生したどのような問題? – Markus

+0

java.lang.IllegalArgumentException:通過するノードをnullにすることはできません! –

+0

この情報を質問に追加してください。理想的にはstacktraceが含まれています。 – Markus

答えて

0

HibernateTemplate::findは、文字列パラメータにHQLクエリを期待して、あなたはネイティブ文を渡しています。 HibernateTemplate::getSessionによって返されたSessionオブジェクトを使用して、ネイティブなもの(クエリ、文など)を実行できます。ネイティブの選択クエリを渡すには、Session::createSQLQuery

BUT本当にこれを行うにはデータベース固有のコードに依存したいのですか?それはDatabaseMetaData::getTablesを使用してそれを行うよりエレガントな方法があります。 this answerを参照してください。 DatabaseMetaData from a callback method of your HibernateTemplateのインスタンスを取得できます。

はこれを試してみてください:

 Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); 
     if(!session instaceof SessionImpl){ 
        //handle this, maybe throw an exception 
       } 
     else { 
      Connection con = (SessionImpl)session.connection(); 
      ... 
     }  
+0

hibernatetemplateからセッションを取得するコードを表示してください。 –

関連する問題