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)
> 

Reply via email to