Your query is configured to return List<CallLog>, yet the result does not have all the expected columns (specifically the PK column - UNIQUEID). That's the cause of the error. You have an option to fetch a List<DataRow> by settings "select.setFetchingDataRows(true)". This will get rid of the error, but won't still give you a List<String>.
If you want a List<String>, you can do it with SQLTemplate with some extra configuration, but I would recommend a more modern SQLSelect. Among other advantages of SQLSelect is no ambiguity on the returned result type: List<String> list = SQLSelect .scalarQuery(String.class, "Select distinct VDN_IntoIVR from CallLog") .select(CallLogReportMain.getObjectContext()); The docs on SQLSelect and the rest of the "modern" Query API are available here [1]. Andrus [1] https://cayenne.apache.org/docs/4.1/cayenne-guide/#queries > On Jul 23, 2018, at 11:41 PM, Andrew Willerding <awillerd...@itsurcom.com> > wrote: > > Hi, > > I could use some insight as to why I'm getting a CayenneRuntimeException > (v.4.1.M1) "No PK Column etc. from the code below.. > > Thanks, > > Andrew > > Here's the code... > > public static List<String> getVDN_InList() { > ArrayList<String> list = new ArrayList<>(); > SQLTemplate select = new SQLTemplate(CallLog.class, "Select distinct > VDN_IntoIVR from CallLog"); > //select.setColumnNamesCapitalization(CapsStrategy.UPPER); > List<String> list2 = > CallLogReportMain.getObjectContext().performQuery(select); > return list; > } > > Executing the actual SQL from the template results in : > > MariaDB [CTIData]> Select distinct VDN_IntoIVR from CallLog > -> ; > +-------------+ > | VDN_IntoIVR | > +-------------+ > | 5390 | > | 5358 | > | 5356 | > | 5369 | > | 5386 | > | 5273 | > | 5367 | > | 5774 | > | 5284 | > | 5382 | > | 5772 | > | 5371 | > | 5287 | > | 5370 | > | 5362 | > | 5281 | > +-------------+ > 16 rows in set (0.00 sec) > > Here's the extract from the DataMap files... > > <db-entity name="CallLog" catalog="CTIData"> > ... > <db-attribute name="TRANSCODE" type="VARCHAR" length="30"/> > <db-attribute name="UNIQUEID" type="VARCHAR" isPrimaryKey="true" > isMandatory="true" length="20"/> > <db-attribute name="UPDATEDBY" type="VARCHAR" length="35"/> > <db-attribute name="VDN_IntoIVR" type="VARCHAR" length="16"/> > ... > > </db-entity> > > Here's the resultant MariaDB table output extract: > > MariaDB [CTIData]> describe CallLog; > +------------------+--------------+------+-----+---------+-------+ > | Field | Type | Null | Key | Default | Extra | > +------------------+--------------+------+-----+---------+-------+ > ... > | TRANSCODE | varchar(30) | YES | | NULL | | > | UNIQUEID | varchar(20) | NO | PRI | NULL | | > | UPDATEDBY | varchar(35) | YES | | NULL | | > | VDN_IntoIVR | varchar(16) | YES | | NULL | | > ... > +------------------+--------------+------+-----+---------+-------+ > > MariaDB [CTIData]> show index from CallLog where Key_name = 'PRIMARY'; > +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ > | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | > Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment > | > +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ > | CallLog | 0 | PRIMARY | 1 | UNIQUEID | A | > 100 | NULL | NULL | | BTREE | | | > +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ > 1 row in set (0.00 sec) > > MariaDB [CTIData]> select * from AUTO_PK_SUPPORT; > +------------------------------------------+---------+ > | TABLE_NAME | NEXT_ID | > +------------------------------------------+---------+ > ... > | CallLog | 200 | > ... > > And here is the exception stack.... > > org.apache.cayenne.CayenneRuntimeException: [v.4.1.M1 Oct 06 2017 09:23:31] > No PK column 'UNIQUEID' found in data row. > at > org.apache.cayenne.access.ObjectResolver.createObjectId(ObjectResolver.java:218) > at > org.apache.cayenne.access.ObjectResolver.objectFromDataRow(ObjectResolver.java:133) > at > org.apache.cayenne.access.ObjectResolver.objectsFromDataRows(ObjectResolver.java:119) > at > org.apache.cayenne.access.ObjectResolver.synchronizedObjectsFromDataRows(ObjectResolver.java:99) > at > org.apache.cayenne.access.ObjectResolver.synchronizedRootResultNodeFromDataRows(ObjectResolver.java:90) > at > org.apache.cayenne.access.DataDomainQueryAction$ObjectConversionStrategy.toResultsTree(DataDomainQueryAction.java:637) > at > org.apache.cayenne.access.DataDomainQueryAction$SingleObjectConversionStrategy.convert(DataDomainQueryAction.java:687) > at > org.apache.cayenne.access.DataDomainQueryAction.interceptObjectConversion(DataDomainQueryAction.java:501) > at > org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:130) > at > org.apache.cayenne.access.DataDomain.onQueryNoFilters(DataDomain.java:564) > at > org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:748) > at > org.apache.cayenne.tx.TransactionFilter.onQuery(TransactionFilter.java:49) > at > org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:748) > at org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:556) > at > org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:406) > at > org.apache.cayenne.util.ObjectContextQueryAction.executePostCache(ObjectContextQueryAction.java:107) > at > org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:94) > at org.apache.cayenne.access.DataContext.onQuery(DataContext.java:965) > at > org.apache.cayenne.access.DataContext.performQuery(DataContext.java:954) > at > com.callistacti.quest.CTIData.database.CallLog.getVDN_InList(CallLog.java:47) >