5

以下のように、SQLクエリを作成する方法がある場合:

public List selectTuple() {
   boolean status = true;
   String query = "SELECT ";
   query += getFields() == null ? " * " : " " + getFields() + " ";
   query += " FROM " + tables;
   if ( getSearchClause() != null ) {
       query += " " + getSearchClause();
   }
   query += ";";
   Debug("SQL...........caleed selectTuple method, query is : "+ query);
   setQuery(query);
   if ( getPrepared() ) {//If this is a Prepared query,
      status = setPreparedStatement();
   } else {
      status = setNonPreparedStatement();
   }
   if ( ! status ) {
      Log("[CRITICAL] (.........)..........");
   }
   status = doExecuteQuery();
   if ( ! status ) {
      Log("[CRITICAL] (.........)..........");
   }
   return( getResults() );
}//method selectTuple

ただし、これは異なるテーブルに使用されるため、フィールドは異なるデータ型 (int、string、date など) になります。では、そのような ResultSet をどのように繰り返すことができますか?

また、そのような挿入クエリを作成するにはどうすればよいですか?

ありがとう。

4

3 に答える 3

2

はい、できると思います... ResultSet で getMetaData() を使用して列の数とタイプを取得し、結果として ResultSet を反復処理できます。

getMetaData() :

ResultSetMetaData クラス

しかし、そのような一般的な挿入クエリをコーディングする方法がわかりません...

于 2012-11-03T02:59:46.727 に答える
1

getObjectを使用して、JDBC から Java オブジェクトへのマッピングを独自のタイプに渡す必要があります (存在する場合)。

したがって、テーブルにi数値列とsvarchar 列がある場合、次のコード

ResultSet rs = st.executeQuery("select i, s from test");
rs.next();
System.out.println(rs.getObject(1).getClass());
System.out.println(rs.getObject(2).getClass());

結果として

class java.lang.Integer
class java.lang.String

instanceofあなたがする唯一のことは、実際のキャストを行うためにを使用して、返されたオブジェクトのクラスをチェックすることです。

詳細については、この記事を参照してください。

挿入部分については、setObjectメソッドを使用して JDBC 変換に依存することができます。これはおそらくあまり良い考えではありませんが、機能するはずです。

于 2012-11-03T03:00:11.730 に答える
0

@jahroy がコメントしたように、このタイプの一般的なものには JDBC を使用しないでください。私も同じ問題を抱えていたので、 JPAで簡単かつエレガントな方法を思いついた

これは、任意のクエリを処理するために作成した一般的なメソッドです。SELECTどのように機能するかを理解できますJPASELECTこの場合、クエリのみが存在することを確認したかっただけですが、より一般的にしてINSERT、 , DELETE, UPDATE...を受け入れることができます。

public List executeSelectQuery(String selectQuery, Class entityClass, String classPersistentUnit)
{
    selectQuery = selectQuery.toUpperCase();
    if(!selectQuery.startsWith("SELECT"))
    {
        throw new IllegalArgumentException("This method only accepts SELECT queries. You tried: " + selectQuery);
    }

    EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(classPersistentUnit);
    EntityManager entityManager = entityManagerFactory.createEntityManager();

    Query query = entityManager.createNativeQuery(selectQuery, entityClass);

    return query.getResultList();
}

良いことは、Netbeans と Eclipse (おそらくもっと多くの IDE もありますが、私はこれら 2 つだけを使用しています) が「自動作成」クラスのエンティティをすぐに思いつくことです! これらのエンティティ クラスでは、何もコーディングする必要はありません。エンティティ クラスは、簡単に言うと、データベース内のテーブルを表します。したがって、データベース内の各テーブルはエンティティ クラスによって表されます。

ここで簡単で小さなチュートリアルを見つけることができます

于 2014-07-20T23:26:40.127 に答える