6.7.5.3 結果セットの反復処理
結果セットを反復処理するには、JDBCに似た方法またはJava Iteratorインタフェースを使用する方法があります。
JDBCのような反復の場合、PgqlResultSet (パッケージoracle.pgx.api)のメソッドはjava.sql.ResultSetのメソッドと似ています。主な違いは、PGQLの結果セット・インタフェースはJava 8で導入された新しい日時ライブラリに基づいているのに対し、java.sql.ResultSetはレガシーjava.util.Dateに基づいていることです。ギャップを埋めるために、PGQLの結果セットは、java.util.Dateをまだ使用しているアプリケーションにgetLegacyDate(..)を提供します。
PgqlResultSetには、最初の行の前に初期設定されるcursorがあります。その後、次のメソッドを使用してカーソルを再配置できます。
next() : booleanprevious() : booleanbeforeFirst()afterLast()first() : booleanlast() : booleanabsolute(long row) : booleanrelative(long rows) : boolean
前述のメソッドの詳細は、ここを参照してください。
getObject(int columnIdx) : ObjectgetObject(String columnName) : ObjectgetString(int columnIdx) : StringgetString(String columnName) : StringgetInteger(int columnIdx) : IntegergetInteger(String columnName) : IntegergetLong(int columnIdx) : LonggetLong(String columnName) : LonggetFloat(int columnIdx) : FloatgetFloat(String columnName) : FloatgetDouble(int columnIdx) : DoublegetDouble(String columnName) : DoublegetBoolean(int columnIdx) : BooleangetBoolean(String columnName) : BooleangetVertexLabels(int columnIdx) : Set<String>getVertexLabels(String columnName) : Set<String>getDate(int columnIdx) : LocalDategetDate(String columnName) : LocalDategetTime(int columnIdx) : LocalTimegetTime(String columnName) : LocalTimegetTimestamp(int columnIdx) : LocalDateTimegetTimestamp(String columnName) : LocalDateTimegetTimeWithTimezone(int columnIdx) : OffsetTimegetTimeWithTimezone(String columnName) : OffsetTimegetTimestampWithTimezone(int columnIdx) : OffsetDateTimegetTimestampWithTimezone(String columnName) : OffsetDateTimegetLegacyDate(int columnIdx) : java.util.DategetLegacyDate(String columnName) : java.util.DategetVertex(int columnIdx) : PgxVertex<ID>getVertex(String columnName) : PgxVertex<ID>getEdge(int columnIdx) : PgxEdgegetEdge(String columnName) : PgxEdge
前述のメソッドの詳細は、ここを参照してください。
最後に、結果セットのリソースを解放するPgqlResultSet.close()があり、PgqlResultSet.getMetaData()を使用して列名と列数を取得できます。
結果セットの反復の例は次のとおりです。
PgqlResultSet resultSet = g.queryPgql(
" SELECT owner.name AS account_holder, SUM(t.amount) AS total_transacted_with_Nikita "
+ " FROM MATCH (p:Person) -[:ownerOf]-> (account1:Account) "
+ " , MATCH (account1) -[t:transaction]- (account2) "
+ " , MATCH (account2:Account) <-[:ownerOf]- (owner:Person|Company) "
+ " WHERE p.name = 'Nikita' "
+ " GROUP BY owner");
while (resultSet.next()) {
String accountHolder = resultSet.getString(1);
long totalTransacted = resultSet.getLong(2);
System.out.println(accountHolder + ": " + totalTransacted);
}
resultSet.close();
前述の例の出力は次のようになります。
Oracle: 4501
Camille: 1000
さらに、PgqlResultSetもJava Iteratorインタフェースを介して反復可能です。結果セットに対する"for each loop"の例は、次のとおりです。
for (PgxResult result : resultSet) {
String accountHolder = result.getString(1);
long totalTransacted = result.getLong(2);
System.out.println(accountHolder + ": " + totalTransacted);
}
前述の例の出力は次のようになります。
Oracle: 4501
Camille: 1000
PgqlResultSetで使用可能なものと同じgetterをPgxResultでも使用できることに注意してください。
親トピック: SELECT問合せを実行するためのJava API