You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by ab...@apache.org on 2019/06/26 13:27:34 UTC
[cayenne] 02/03: CAY-2588 IdRowReader:
ArrayIndexOutOfBoundsException
This is an automated email from the ASF dual-hosted git repository.
abulatski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit 01f3755859d5933971a9941a0ae25a8780904ff9
Author: Arseni Bulatski <an...@gmail.com>
AuthorDate: Wed Jun 26 16:21:14 2019 +0300
CAY-2588 IdRowReader: ArrayIndexOutOfBoundsException
---
.../cayenne/access/jdbc/reader/IdRowReader.java | 14 ++++-----
.../org/apache/cayenne/query/ColumnSelectIT.java | 34 ++++++++++++++++++++++
2 files changed, 40 insertions(+), 8 deletions(-)
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/reader/IdRowReader.java b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/reader/IdRowReader.java
index 4005fae..2b4d79a 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/reader/IdRowReader.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/reader/IdRowReader.java
@@ -19,8 +19,6 @@
package org.apache.cayenne.access.jdbc.reader;
import java.sql.ResultSet;
-import java.util.HashSet;
-import java.util.Set;
import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.DataRow;
@@ -58,14 +56,14 @@ class IdRowReader<T> extends BaseRowReader<T> {
ColumnDescriptor[] columns = descriptor.getColumns();
- Set<DbAttribute> addedAttributes = new HashSet<>();
int[] pk = new int[len];
- int index = 0;
- for(int i = 0; i < columns.length; i++) {
+ int offset = resultMetadata != null ?
+ resultMetadata.getColumnOffset() :
+ 0;
+ for(int i = offset, j = 0; i < offset + len; i++) {
DbAttribute a = dbEntity.getAttribute(columns[i].getName());
- if(a != null && a.isPrimaryKey() && !addedAttributes.contains(a)) {
- pk[index++] = i;
- addedAttributes.add(a);
+ if(a != null && a.isPrimaryKey()) {
+ pk[j++] = i;
}
}
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/ColumnSelectIT.java b/cayenne-server/src/test/java/org/apache/cayenne/query/ColumnSelectIT.java
index d275b51..3f31925 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/ColumnSelectIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/query/ColumnSelectIT.java
@@ -44,6 +44,8 @@ import org.apache.cayenne.exp.property.StringProperty;
import org.apache.cayenne.test.jdbc.DBHelper;
import org.apache.cayenne.test.jdbc.TableHelper;
import org.apache.cayenne.testdo.testmap.Artist;
+import org.apache.cayenne.testdo.testmap.ArtistExhibit;
+import org.apache.cayenne.testdo.testmap.Exhibit;
import org.apache.cayenne.testdo.testmap.Gallery;
import org.apache.cayenne.testdo.testmap.Painting;
import org.apache.cayenne.testdo.testmap.PaintingInfo;
@@ -1118,4 +1120,36 @@ public class ColumnSelectIT extends ServerCase {
assertEquals("artist1", ((Artist)results.get(0)[0]).getArtistName());
assertEquals(1, results.get(0)[1]);
}
+
+ @Test
+ public void test2Objects2Pk() {
+ Artist artist = ObjectSelect.query(Artist.class)
+ .where(Artist.ARTIST_ID_PK_PROPERTY.eq(1L))
+ .selectFirst(context);
+ ArtistExhibit artistExhibit = context.newObject(ArtistExhibit.class);
+ Exhibit exhibit = context.newObject(Exhibit.class);
+ exhibit.setOpeningDate(new Date());
+ exhibit.setClosingDate(new Date());
+ artistExhibit.setToArtist(artist);
+ artistExhibit.setToExhibit(exhibit);
+ Gallery gallery = context.newObject(Gallery.class);
+ gallery.setGalleryName("Test");
+ exhibit.setToGallery(gallery);
+ context.commitChanges();
+
+ List<Object[]> results = ObjectSelect.columnQuery(Artist.class,
+ Artist.ARTIST_NAME,
+ PropertyFactory.createSelf(Artist.class),
+ PropertyFactory
+ .createBase(ExpressionFactory
+ .dbPathExp("artistExhibitArray.ARTIST_ID"),
+ Integer.class))
+ .where(Artist.ARTIST_ID_PK_PROPERTY.eq(1L))
+ .pageSize(1)
+ .select(context);
+ assertEquals(1, results.size());
+ assertEquals("artist1", results.get(0)[0]);
+ assertEquals("artist1", ((Artist)results.get(0)[1]).getArtistName());
+ assertEquals(1, results.get(0)[2]);
+ }
}