Yeah. 

Note that the new query API is available since 4.0.
Also the old query API still works. It just looks more clunky by comparison.

Andrus

> On Jul 24, 2018, at 4:28 PM, Andrew Willerding <[email protected]> 
> wrote:
> 
> Ah I see.  Things have changed a bit in 4.1 so I should pay a bit more 
> attention to what's new.  ;-)
> 
> Thank you!
> 
> 
> On 2018-07-24 02:29 AM, Andrus Adamchik wrote:
>> 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 <[email protected]> 
>>> 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