You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cayenne.apache.org by Lachlan Deck <la...@gmail.com> on 2008/08/13 09:17:34 UTC

ObjEntity.translateToDbPath

Hi there,

Just wondering why the above produces stuff like (db:isDeleted = null)  
rather than (isDeleted = null)?
The former obviously can't be evaluated against the database.

with regards,
--

Lachlan Deck




Re: ObjEntity.translateToDbPath

Posted by Andrus Adamchik <an...@objectstyle.org>.
> Yes, but did you see my message at the bottom of the previous message?

Honestly I didn't.

Yeah, would be nice for EJBQL to handle IS NULL conversion  
automatically.

(1) and (3) look like the same problem? Not quite sure about the cause  
just yet.

(2) is caused by date passed as a literal. The only way to handle a  
date is to pass it as a parameter, so we need to come up with some  
tricks for toEJBQL to support parameters.

My suggestion would be to log a bug report with all these cases, and  
use EJBQL directly without toEJBQL conversion. I don't fully  
understand the IndirectQuery inheritance in your example. Such  
superclass would've been needed if you'd run this query with Cayenne,  
but instead you are using your own queryResult method that creates a  
substitute query.

Andrus




On Aug 14, 2008, at 12:30 AM, Lachlan Deck wrote:

> On 14/08/2008, at 7:02 AM, Andrus Adamchik wrote:
>
>> On Aug 13, 2008, at 11:42 PM, Lachlan Deck wrote:
>>
>>> (a.isDeleted = null)
>>
>> A possible problem. Unlike Cayenne expressions, EJBQL does not  
>> support "= null", it requires "IS NULL" instead. Pretty stupid :-/
>
> Yes, but did you see my message at the bottom of the previous  
> message? i.e., when I regex-replace this with IS NULL ... I get  
> other problems. i.e., Boolean.FALSE has not been converted to  
> something usable and no matter what I do I keep getting parse errors.
>
> i.e., doing the following is not enough:
> String clause = this.expression.toEJBQL("a");
> clause = clause.replaceAll("\\Q= null\\E", "IS NULL");
> clause = clause.replaceAll("\\Q!= null\\E", "IS NOT NULL");
> clause = clause.replaceAll("\\Q!=\\E", "<>");
> query.append(clause);
>
> Is there anything else that I can pass the Expression to (or result  
> of toEJBQL(...)) that will work?
>
> The results after doing the above (three queries below) are that  
> null is still failing and other stuff doesn't work either. These are  
> naturally not exhaustive examples of queries that will fail... so  
> I'm wondering how do make this work or if it's currently possible?
>
> (Note: I had other similar problems trying to use an SQLTemplate  
> with translating the expression).
>
> 1)
> query --> SELECT count(a) FROM CourseClass a WHERE (a.isDeleted IS  
> NULL) or (a.isDeleted = false)
>     [java]
>     [java] WARNING: org.apache.cayenne.CayenneRuntimeException: [v. 
> 3.0-SNAPSHOT Jul 09 2008 01:28:38] Query exception.
>     [java] org.apache.cayenne.CayenneRuntimeException: [v.3.0- 
> SNAPSHOT Jul 09 2008 01:28:38] Query exception.
>     [java] 	at  
> org 
> .apache 
> .cayenne 
> .access 
> .DataDomainQueryAction.nextQueryException(DataDomainQueryAction.java: 
> 551)
>     [java] 	at  
> org.apache.cayenne.access.DataNode.performQueries(DataNode.java:237)
>     [java] 	at  
> org 
> .apache 
> .cayenne 
> .access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:424)
>     [java] 	at org.apache.cayenne.access.DataDomainQueryAction.access 
> $0(DataDomainQueryAction.java:403)
>     [java] 	at org.apache.cayenne.access.DataDomainQueryAction 
> $2.transform(DataDomainQueryAction.java:397)
>     [java] 	at  
> org 
> .apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java: 
> 847)
>     [java] 	at  
> org 
> .apache 
> .cayenne 
> .access 
> .DataDomainQueryAction 
> .runQueryInTransaction(DataDomainQueryAction.java:394)
>     [java] 	at  
> org 
> .apache 
> .cayenne 
> .access.DataDomainQueryAction.execute(DataDomainQueryAction.java:120)
>     [java] 	at  
> org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:740)
>     [java] 	at  
> org 
> .apache 
> .cayenne 
> .util 
> .ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:317)
>     [java] 	at  
> org 
> .apache 
> .cayenne 
> .util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java: 
> 96)
>     [java] 	at  
> org.apache.cayenne.access.DataContext.onQuery(DataContext.java:1336)
>     [java] 	at  
> org.apache.cayenne.access.DataContext.performQuery(DataContext.java: 
> 1325)
>     [java] 	at  
> org 
> .apache.cayenne.DataObjectUtils.objectForQuery(DataObjectUtils.java: 
> 274)
>     [java] 	at  
> ish.persistence.StatsQuery.queryResult(StatsQuery.java:167)
> 		<...>
>     [java] Caused by: org.apache.cayenne.ejbql.EJBQLException: [v. 
> 3.0-SNAPSHOT Jul 09 2008 01:28:38] Invalid identification variable:  
> null
>     [java] 	at  
> org 
> .apache 
> .cayenne 
> .access 
> .jdbc 
> .EJBQLConditionTranslator 
> .visitIdentificationVariable(EJBQLConditionTranslator.java:486)
>     [java] 	at  
> org 
> .apache 
> .cayenne 
> .ejbql 
> .parser 
> .EJBQLIdentificationVariable.visit(EJBQLIdentificationVariable.java: 
> 35)
>     [java] 	at  
> org 
> .apache.cayenne.ejbql.parser.SimpleNode.visitChild(SimpleNode.java:84)
>     [java] 	at  
> org 
> .apache.cayenne.ejbql.parser.EJBQLEquals.visitChild(EJBQLEquals.java: 
> 40)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:64)
>     [java] 	at  
> org 
> .apache.cayenne.ejbql.parser.SimpleNode.visitChild(SimpleNode.java:84)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.EJBQLOr.visitChild(EJBQLOr.java:40)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:64)
>     [java] 	at  
> org 
> .apache 
> .cayenne 
> .access.jdbc.EJBQLJoinAppender.appendTable(EJBQLJoinAppender.java:193)
>     [java] 	at  
> org 
> .apache 
> .cayenne 
> .access 
> .jdbc.EJBQLFromTranslator.visitFromItem(EJBQLFromTranslator.java:64)
>     [java] 	at  
> org 
> .apache 
> .cayenne.ejbql.parser.EJBQLFromItem.visitNode(EJBQLFromItem.java:89)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:60)
>     [java] 	at  
> org 
> .apache.cayenne.ejbql.parser.SimpleNode.visitChild(SimpleNode.java:84)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.EJBQLFrom.visitChild(EJBQLFrom.java: 
> 40)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:64)
>     [java] 	at  
> org 
> .apache 
> .cayenne 
> .access 
> .jdbc.EJBQLSelectTranslator.visitFrom(EJBQLSelectTranslator.java:56)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.EJBQLFrom.visitNode(EJBQLFrom.java:35)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:60)
>     [java] 	at  
> org 
> .apache.cayenne.ejbql.parser.SimpleNode.visitChild(SimpleNode.java:84)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:64)
>     [java] 	at org.apache.cayenne.access.jdbc.EJBQLAction 
> $1.visitSelect(EJBQLAction.java:73)
>     [java] 	at  
> org 
> .apache.cayenne.ejbql.parser.EJBQLSelect.visitNode(EJBQLSelect.java: 
> 35)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:60)
>     [java] 	at  
> org 
> .apache 
> .cayenne.access.jdbc.EJBQLAction.performAction(EJBQLAction.java:67)
>     [java] 	at  
> org 
> .apache 
> .cayenne 
> .access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:58)
>     [java] 	at  
> org.apache.cayenne.access.DataNode.performQueries(DataNode.java:230)
>     [java] 	... 41 more
>
> 2)
>     [java] query --> SELECT count(a) FROM CourseClass a WHERE  
> ((a.isDeleted IS NULL) or (a.isDeleted = false)) and ((a.endDateTime  
> >= Thu Aug 14 00:00:00 EST 2008) or (a.endDateTime IS NULL)) and  
> (a.isCancelled <> true)
>     [java]
>     [java] 14/08/2008 07:23:19  
> com.caucho.hessian.server.HessianSkeleton invoke
>     [java] WARNING: org.apache.cayenne.ejbql.EJBQLException: [v.3.0- 
> SNAPSHOT Jul 09 2008 01:28:38] Error parsing EJB QL statement
>     [java] org.apache.cayenne.ejbql.EJBQLException: [v.3.0-SNAPSHOT  
> Jul 09 2008 01:28:38] Error parsing EJB QL statement
>     [java] 	at org.apache.cayenne.ejbql.parser.EJBQL 
> $EJBQLDefaultParser.compile(EJBQL.java:31)
>     [java] 	at  
> org.apache.cayenne.query.EJBQLQuery.getExpression(EJBQLQuery.java:86)
>     [java] 	at  
> org 
> .apache 
> .cayenne.query.EJBQLQueryMetadata.resolve(EJBQLQueryMetadata.java:45)
>     [java] 	at  
> org.apache.cayenne.query.EJBQLQuery.getMetaData(EJBQLQuery.java:52)
>     [java] 	at  
> org 
> .apache 
> .cayenne 
> .util.ObjectContextQueryAction.<init>(ObjectContextQueryAction.java: 
> 79)
>     [java] 	at  
> org 
> .apache 
> .cayenne 
> .access.DataContextQueryAction.<init>(DataContextQueryAction.java:49)
>     [java] 	at  
> org.apache.cayenne.access.DataContext.onQuery(DataContext.java:1336)
>     [java] 	at  
> org.apache.cayenne.access.DataContext.performQuery(DataContext.java: 
> 1325)
>     [java] 	at  
> org 
> .apache.cayenne.DataObjectUtils.objectForQuery(DataObjectUtils.java: 
> 274)
>     [java] 	at  
> ish.persistence.StatsQuery.queryResult(StatsQuery.java:167)
> 		<...>
>     [java] Caused by:  
> org.apache.cayenne.ejbql.parser.ParseException: Encountered "a .  
> endDateTime >= Thu Aug" at line 1, column 97.
>     [java] Was expecting one of:
>     [java]     "(" ...
>     [java]     "NOT" ...
>     [java]     "+" ...
>     [java]     "-" ...
>     [java]     <DECIMAL_LITERAL> ...
>     [java]     <INTEGER_LITERAL> ...
>     [java]     ":" ...
>     [java]     "?" ...
>     [java]     "db:" ...
>     [java]     <IDENTIFIER> "." "NEW" ...
>     [java]     <IDENTIFIER> "." "ALL" ...
>     [java]     <IDENTIFIER> "." "ANY" ...
>     [java]     <IDENTIFIER> "." "EXISTS" ...
>     [java]     <IDENTIFIER> "." "SOME" ...
>     [java]     <IDENTIFIER> "." "EMPTY" ...
>     [java]     <IDENTIFIER> "." "ASC" ...
>     [java]     <IDENTIFIER> "." "DESC" ...
>     [java]     <IDENTIFIER> "." "ORDER" ...
>     [java]     <IDENTIFIER> "." "IS" ...
>     [java]     <IDENTIFIER> "." "MEMBER" ...
>     [java]     <IDENTIFIER> "." "OF" ...
>     [java]     <IDENTIFIER> "." "LIKE" ...
>     [java]     <IDENTIFIER> "." "ESCAPE" ...
>     [java]     <IDENTIFIER> "." "BETWEEN" ...
>     [java]     <IDENTIFIER> "." "NULL" ...
>     [java]     <IDENTIFIER> "." "AVG" ...
>     [java]     <IDENTIFIER> "." "MIN" ...
>     [java]     <IDENTIFIER> "." "MAX" ...
>     [java]     <IDENTIFIER> "." "SUM" ...
>     [java]     <IDENTIFIER> "." "COUNT" ...
>     [java]     <IDENTIFIER> "." "OR" ...
>     [java]     <IDENTIFIER> "." "AND" ...
>     [java]     <IDENTIFIER> "." "NOT" ...
>     [java]     <IDENTIFIER> "." "CONCAT" ...
>     [java]     <IDENTIFIER> "." "SUBSTRING" ...
>     [java]     <IDENTIFIER> "." "TRIM" ...
>     [java]     <IDENTIFIER> "." "LOWER" ...
>     [java]     <IDENTIFIER> "." "UPPER" ...
>     [java]     <IDENTIFIER> "." "LEADING" ...
>     [java]     <IDENTIFIER> "." "TRAILING" ...
>     [java]     <IDENTIFIER> "." "BOTH" ...
>     [java]     <IDENTIFIER> "." "LENGTH" ...
>     [java]     <IDENTIFIER> "." "LOCATE" ...
>     [java]     <IDENTIFIER> "." "ABS" ...
>     [java]     <IDENTIFIER> "." "SQRT" ...
>     [java]     <IDENTIFIER> "." "MOD" ...
>     [java]     <IDENTIFIER> "." "SIZE" ...
>     [java]     <IDENTIFIER> "." "CURRENT_DATE" ...
>     [java]     <IDENTIFIER> "." "CURRENT_TIME" ...
>     [java]     <IDENTIFIER> "." "CURRENT_TIMESTAMP" ...
>     [java]     <IDENTIFIER> "." "SELECT" ...
>     [java]     <IDENTIFIER> "." "DISTINCT" ...
>     [java]     <IDENTIFIER> "." "FROM" ...
>     [java]     <IDENTIFIER> "." "UPDATE" ...
>     [java]     <IDENTIFIER> "." "DELETE" ...
>     [java]     <IDENTIFIER> "." "WHERE" ...
>     [java]     <IDENTIFIER> "." "GROUP" ...
>     [java]     <IDENTIFIER> "." "BY" ...
>     [java]     <IDENTIFIER> "." "HAVING" ...
>     [java]     <IDENTIFIER> "." "AS" ...
>     [java]     <IDENTIFIER> "." "LEFT" ...
>     [java]     <IDENTIFIER> "." "OUTER" ...
>     [java]     <IDENTIFIER> "." "INNER" ...
>     [java]     <IDENTIFIER> "." "JOIN" ...
>     [java]     <IDENTIFIER> "." "FETCH" ...
>     [java]     <IDENTIFIER> "." "IN" ...
>     [java]     <IDENTIFIER> "." "SET" ...
>     [java]     <IDENTIFIER> "." "OBJECT" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> "." ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> "*" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> "/" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> "+" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> "-" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ")" ...
>     [java]     <STRING_LITERAL> ...
>     [java]     "SELECT" ...
>     [java]     "EXISTS" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> "=" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "+" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "-" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">="  
> <DECIMAL_LITERAL> ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">="  
> <INTEGER_LITERAL> ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" ":" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "?" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "db:" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" <IDENTIFIER> "." ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "(" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "LENGTH" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "LOCATE" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "ABS" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "SQRT" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "MOD" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "SIZE" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "AVG" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "MAX" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "MIN" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "SUM" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "COUNT" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "SELECT" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "ANY" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "SOME" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "ALL" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> "<" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> "<=" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> "<>" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" <STRING_LITERAL> ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "CONCAT" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "SUBSTRING" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "TRIM" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "LOWER" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "UPPER" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "CURRENT_DATE" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "CURRENT_TIME" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> ">="  
> "CURRENT_TIMESTAMP" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> "NOT" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> "BETWEEN" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> "LIKE" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> "IN" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> "IS" ...
>     [java]     <IDENTIFIER> "." <IDENTIFIER> "MEMBER" ...
>     [java]
>     [java] 	at  
> org 
> .apache.cayenne.ejbql.parser.EJBQL.generateParseException(EJBQL.java: 
> 9409)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.EJBQL.jj_consume_token(EJBQL.java: 
> 9286)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.EJBQL.conditional_primary(EJBQL.java: 
> 1931)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.EJBQL.conditional_factor(EJBQL.java: 
> 1909)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.EJBQL.conditional_term(EJBQL.java: 
> 1774)
>     [java] 	at  
> org 
> .apache.cayenne.ejbql.parser.EJBQL.conditional_expression(EJBQL.java: 
> 1736)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.EJBQL.conditional_primary(EJBQL.java: 
> 1926)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.EJBQL.conditional_factor(EJBQL.java: 
> 1909)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.EJBQL.conditional_term(EJBQL.java: 
> 1774)
>     [java] 	at  
> org 
> .apache.cayenne.ejbql.parser.EJBQL.conditional_expression(EJBQL.java: 
> 1736)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.EJBQL.conditional_primary(EJBQL.java: 
> 1926)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.EJBQL.conditional_factor(EJBQL.java: 
> 1909)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.EJBQL.conditional_term(EJBQL.java: 
> 1774)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.EJBQL.conditional_term(EJBQL.java: 
> 1787)
>     [java] 	at  
> org 
> .apache.cayenne.ejbql.parser.EJBQL.conditional_expression(EJBQL.java: 
> 1736)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.EJBQL.where_clause(EJBQL.java:1583)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.EJBQL.select_statement(EJBQL.java:67)
>     [java] 	at  
> org.apache.cayenne.ejbql.parser.EJBQL.parseQuery(EJBQL.java:39)
>     [java] 	at org.apache.cayenne.ejbql.parser.EJBQL 
> $EJBQLDefaultParser.compile(EJBQL.java:28)
>     [java] 	... 37 more
>
>
> 3)
>     [java] query --> SELECT count(a) FROM CourseClass a WHERE  
> (a.isDeleted IS NULL) or (a.isDeleted = false)
>     [java]
>     [java] 14/08/2008 07:23:19  
> com.caucho.hessian.server.HessianSkeleton invoke
>     [java] WARNING: org.apache.cayenne.CayenneRuntimeException: [v. 
> 3.0-SNAPSHOT Jul 09 2008 01:28:38] Query exception.
>     [java] org.apache.cayenne.CayenneRuntimeException: [v.3.0- 
> SNAPSHOT Jul 09 2008 01:28:38] Query exception.
>     [java] 	at  
> org 
> .apache 
> .cayenne 
> .access 
> .DataDomainQueryAction.nextQueryException(DataDomainQueryAction.java: 
> 551)
>     [java] 	at  
> org.apache.cayenne.access.DataNode.performQueries(DataNode.java:237)
>     [java] 	at  
> org 
> .apache 
> .cayenne 
> .access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:424)
>     [java] 	at org.apache.cayenne.access.DataDomainQueryAction.access 
> $0(DataDomainQueryAction.java:403)
>     [java] 	at org.apache.cayenne.access.DataDomainQueryAction 
> $2.transform(DataDomainQueryAction.java:397)
>     [java] 	at  
> org 
> .apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java: 
> 847)
>     [java] 	at  
> org 
> .apache 
> .cayenne 
> .access 
> .DataDomainQueryAction 
> .runQueryInTransaction(DataDomainQueryAction.java:394)
>     [java] 	at  
> org 
> .apache 
> .cayenne 
> .access.DataDomainQueryAction.execute(DataDomainQueryAction.java:120)
>     [java] 	at  
> org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:740)
>     [java] 	at  
> org 
> .apache 
> .cayenne 
> .util 
> .ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:317)
>     [java] 	at  
> org 
> .apache 
> .cayenne 
> .util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java: 
> 96)
>     [java] 	at  
> org.apache.cayenne.access.DataContext.onQuery(DataContext.java:1336)
>     [java] 	at  
> org.apache.cayenne.access.DataContext.performQuery(DataContext.java: 
> 1325)
>     [java] 	at  
> org 
> .apache.cayenne.DataObjectUtils.objectForQuery(DataObjectUtils.java: 
> 274)
>     [java] 	at  
> ish.persistence.StatsQuery.queryResult(StatsQuery.java:167)
>     [java] Caused by: org.apache.cayenne.ejbql.EJBQLException: [v. 
> 3.0-SNAPSHOT Jul 09 2008 01:28:38] Invalid identification variable:  
> null
>
> with regards,
> --
>
> Lachlan Deck
>
>


Re: ObjEntity.translateToDbPath

Posted by Lachlan Deck <la...@gmail.com>.
On 14/08/2008, at 7:02 AM, Andrus Adamchik wrote:

> On Aug 13, 2008, at 11:42 PM, Lachlan Deck wrote:
>
>> (a.isDeleted = null)
>
> A possible problem. Unlike Cayenne expressions, EJBQL does not  
> support "= null", it requires "IS NULL" instead. Pretty stupid :-/

Yes, but did you see my message at the bottom of the previous message?  
i.e., when I regex-replace this with IS NULL ... I get other problems.  
i.e., Boolean.FALSE has not been converted to something usable and no  
matter what I do I keep getting parse errors.

i.e., doing the following is not enough:
String clause = this.expression.toEJBQL("a");
clause = clause.replaceAll("\\Q= null\\E", "IS NULL");
clause = clause.replaceAll("\\Q!= null\\E", "IS NOT NULL");
clause = clause.replaceAll("\\Q!=\\E", "<>");
query.append(clause);

Is there anything else that I can pass the Expression to (or result of  
toEJBQL(...)) that will work?

The results after doing the above (three queries below) are that null  
is still failing and other stuff doesn't work either. These are  
naturally not exhaustive examples of queries that will fail... so I'm  
wondering how do make this work or if it's currently possible?

(Note: I had other similar problems trying to use an SQLTemplate with  
translating the expression).

1)
query --> SELECT count(a) FROM CourseClass a WHERE (a.isDeleted IS  
NULL) or (a.isDeleted = false)
      [java]
      [java] WARNING: org.apache.cayenne.CayenneRuntimeException: [v. 
3.0-SNAPSHOT Jul 09 2008 01:28:38] Query exception.
      [java] org.apache.cayenne.CayenneRuntimeException: [v.3.0- 
SNAPSHOT Jul 09 2008 01:28:38] Query exception.
      [java] 	at  
org 
.apache 
.cayenne 
.access 
.DataDomainQueryAction.nextQueryException(DataDomainQueryAction.java: 
551)
      [java] 	at  
org.apache.cayenne.access.DataNode.performQueries(DataNode.java:237)
      [java] 	at  
org 
.apache 
.cayenne 
.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:424)
      [java] 	at org.apache.cayenne.access.DataDomainQueryAction.access 
$0(DataDomainQueryAction.java:403)
      [java] 	at org.apache.cayenne.access.DataDomainQueryAction 
$2.transform(DataDomainQueryAction.java:397)
      [java] 	at  
org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java: 
847)
      [java] 	at  
org 
.apache 
.cayenne 
.access 
.DataDomainQueryAction 
.runQueryInTransaction(DataDomainQueryAction.java:394)
      [java] 	at  
org 
.apache 
.cayenne 
.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:120)
      [java] 	at  
org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:740)
      [java] 	at  
org 
.apache 
.cayenne 
.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java: 
317)
      [java] 	at  
org 
.apache 
.cayenne 
.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:96)
      [java] 	at  
org.apache.cayenne.access.DataContext.onQuery(DataContext.java:1336)
      [java] 	at  
org.apache.cayenne.access.DataContext.performQuery(DataContext.java: 
1325)
      [java] 	at  
org.apache.cayenne.DataObjectUtils.objectForQuery(DataObjectUtils.java: 
274)
      [java] 	at  
ish.persistence.StatsQuery.queryResult(StatsQuery.java:167)
		<...>
      [java] Caused by: org.apache.cayenne.ejbql.EJBQLException: [v. 
3.0-SNAPSHOT Jul 09 2008 01:28:38] Invalid identification variable: null
      [java] 	at  
org 
.apache 
.cayenne 
.access 
.jdbc 
.EJBQLConditionTranslator 
.visitIdentificationVariable(EJBQLConditionTranslator.java:486)
      [java] 	at  
org 
.apache 
.cayenne 
.ejbql 
.parser 
.EJBQLIdentificationVariable.visit(EJBQLIdentificationVariable.java:35)
      [java] 	at  
org.apache.cayenne.ejbql.parser.SimpleNode.visitChild(SimpleNode.java: 
84)
      [java] 	at  
org 
.apache.cayenne.ejbql.parser.EJBQLEquals.visitChild(EJBQLEquals.java:40)
      [java] 	at  
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:64)
      [java] 	at  
org.apache.cayenne.ejbql.parser.SimpleNode.visitChild(SimpleNode.java: 
84)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQLOr.visitChild(EJBQLOr.java:40)
      [java] 	at  
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:64)
      [java] 	at  
org 
.apache 
.cayenne 
.access.jdbc.EJBQLJoinAppender.appendTable(EJBQLJoinAppender.java:193)
      [java] 	at  
org 
.apache 
.cayenne 
.access 
.jdbc.EJBQLFromTranslator.visitFromItem(EJBQLFromTranslator.java:64)
      [java] 	at  
org 
.apache 
.cayenne.ejbql.parser.EJBQLFromItem.visitNode(EJBQLFromItem.java:89)
      [java] 	at  
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:60)
      [java] 	at  
org.apache.cayenne.ejbql.parser.SimpleNode.visitChild(SimpleNode.java: 
84)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQLFrom.visitChild(EJBQLFrom.java:40)
      [java] 	at  
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:64)
      [java] 	at  
org 
.apache 
.cayenne 
.access 
.jdbc.EJBQLSelectTranslator.visitFrom(EJBQLSelectTranslator.java:56)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQLFrom.visitNode(EJBQLFrom.java:35)
      [java] 	at  
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:60)
      [java] 	at  
org.apache.cayenne.ejbql.parser.SimpleNode.visitChild(SimpleNode.java: 
84)
      [java] 	at  
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:64)
      [java] 	at org.apache.cayenne.access.jdbc.EJBQLAction 
$1.visitSelect(EJBQLAction.java:73)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQLSelect.visitNode(EJBQLSelect.java: 
35)
      [java] 	at  
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:60)
      [java] 	at  
org 
.apache.cayenne.access.jdbc.EJBQLAction.performAction(EJBQLAction.java: 
67)
      [java] 	at  
org 
.apache 
.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java: 
58)
      [java] 	at  
org.apache.cayenne.access.DataNode.performQueries(DataNode.java:230)
      [java] 	... 41 more

2)
      [java] query --> SELECT count(a) FROM CourseClass a WHERE  
((a.isDeleted IS NULL) or (a.isDeleted = false)) and ((a.endDateTime  
 >= Thu Aug 14 00:00:00 EST 2008) or (a.endDateTime IS NULL)) and  
(a.isCancelled <> true)
      [java]
      [java] 14/08/2008 07:23:19  
com.caucho.hessian.server.HessianSkeleton invoke
      [java] WARNING: org.apache.cayenne.ejbql.EJBQLException: [v.3.0- 
SNAPSHOT Jul 09 2008 01:28:38] Error parsing EJB QL statement
      [java] org.apache.cayenne.ejbql.EJBQLException: [v.3.0-SNAPSHOT  
Jul 09 2008 01:28:38] Error parsing EJB QL statement
      [java] 	at org.apache.cayenne.ejbql.parser.EJBQL 
$EJBQLDefaultParser.compile(EJBQL.java:31)
      [java] 	at  
org.apache.cayenne.query.EJBQLQuery.getExpression(EJBQLQuery.java:86)
      [java] 	at  
org 
.apache 
.cayenne.query.EJBQLQueryMetadata.resolve(EJBQLQueryMetadata.java:45)
      [java] 	at  
org.apache.cayenne.query.EJBQLQuery.getMetaData(EJBQLQuery.java:52)
      [java] 	at  
org 
.apache 
.cayenne 
.util.ObjectContextQueryAction.<init>(ObjectContextQueryAction.java:79)
      [java] 	at  
org 
.apache 
.cayenne 
.access.DataContextQueryAction.<init>(DataContextQueryAction.java:49)
      [java] 	at  
org.apache.cayenne.access.DataContext.onQuery(DataContext.java:1336)
      [java] 	at  
org.apache.cayenne.access.DataContext.performQuery(DataContext.java: 
1325)
      [java] 	at  
org.apache.cayenne.DataObjectUtils.objectForQuery(DataObjectUtils.java: 
274)
      [java] 	at  
ish.persistence.StatsQuery.queryResult(StatsQuery.java:167)
		<...>
      [java] Caused by:  
org.apache.cayenne.ejbql.parser.ParseException: Encountered "a .  
endDateTime >= Thu Aug" at line 1, column 97.
      [java] Was expecting one of:
      [java]     "(" ...
      [java]     "NOT" ...
      [java]     "+" ...
      [java]     "-" ...
      [java]     <DECIMAL_LITERAL> ...
      [java]     <INTEGER_LITERAL> ...
      [java]     ":" ...
      [java]     "?" ...
      [java]     "db:" ...
      [java]     <IDENTIFIER> "." "NEW" ...
      [java]     <IDENTIFIER> "." "ALL" ...
      [java]     <IDENTIFIER> "." "ANY" ...
      [java]     <IDENTIFIER> "." "EXISTS" ...
      [java]     <IDENTIFIER> "." "SOME" ...
      [java]     <IDENTIFIER> "." "EMPTY" ...
      [java]     <IDENTIFIER> "." "ASC" ...
      [java]     <IDENTIFIER> "." "DESC" ...
      [java]     <IDENTIFIER> "." "ORDER" ...
      [java]     <IDENTIFIER> "." "IS" ...
      [java]     <IDENTIFIER> "." "MEMBER" ...
      [java]     <IDENTIFIER> "." "OF" ...
      [java]     <IDENTIFIER> "." "LIKE" ...
      [java]     <IDENTIFIER> "." "ESCAPE" ...
      [java]     <IDENTIFIER> "." "BETWEEN" ...
      [java]     <IDENTIFIER> "." "NULL" ...
      [java]     <IDENTIFIER> "." "AVG" ...
      [java]     <IDENTIFIER> "." "MIN" ...
      [java]     <IDENTIFIER> "." "MAX" ...
      [java]     <IDENTIFIER> "." "SUM" ...
      [java]     <IDENTIFIER> "." "COUNT" ...
      [java]     <IDENTIFIER> "." "OR" ...
      [java]     <IDENTIFIER> "." "AND" ...
      [java]     <IDENTIFIER> "." "NOT" ...
      [java]     <IDENTIFIER> "." "CONCAT" ...
      [java]     <IDENTIFIER> "." "SUBSTRING" ...
      [java]     <IDENTIFIER> "." "TRIM" ...
      [java]     <IDENTIFIER> "." "LOWER" ...
      [java]     <IDENTIFIER> "." "UPPER" ...
      [java]     <IDENTIFIER> "." "LEADING" ...
      [java]     <IDENTIFIER> "." "TRAILING" ...
      [java]     <IDENTIFIER> "." "BOTH" ...
      [java]     <IDENTIFIER> "." "LENGTH" ...
      [java]     <IDENTIFIER> "." "LOCATE" ...
      [java]     <IDENTIFIER> "." "ABS" ...
      [java]     <IDENTIFIER> "." "SQRT" ...
      [java]     <IDENTIFIER> "." "MOD" ...
      [java]     <IDENTIFIER> "." "SIZE" ...
      [java]     <IDENTIFIER> "." "CURRENT_DATE" ...
      [java]     <IDENTIFIER> "." "CURRENT_TIME" ...
      [java]     <IDENTIFIER> "." "CURRENT_TIMESTAMP" ...
      [java]     <IDENTIFIER> "." "SELECT" ...
      [java]     <IDENTIFIER> "." "DISTINCT" ...
      [java]     <IDENTIFIER> "." "FROM" ...
      [java]     <IDENTIFIER> "." "UPDATE" ...
      [java]     <IDENTIFIER> "." "DELETE" ...
      [java]     <IDENTIFIER> "." "WHERE" ...
      [java]     <IDENTIFIER> "." "GROUP" ...
      [java]     <IDENTIFIER> "." "BY" ...
      [java]     <IDENTIFIER> "." "HAVING" ...
      [java]     <IDENTIFIER> "." "AS" ...
      [java]     <IDENTIFIER> "." "LEFT" ...
      [java]     <IDENTIFIER> "." "OUTER" ...
      [java]     <IDENTIFIER> "." "INNER" ...
      [java]     <IDENTIFIER> "." "JOIN" ...
      [java]     <IDENTIFIER> "." "FETCH" ...
      [java]     <IDENTIFIER> "." "IN" ...
      [java]     <IDENTIFIER> "." "SET" ...
      [java]     <IDENTIFIER> "." "OBJECT" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "." ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "*" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "/" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "+" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "-" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ")" ...
      [java]     <STRING_LITERAL> ...
      [java]     "SELECT" ...
      [java]     "EXISTS" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "=" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "+" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "-" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">="  
<DECIMAL_LITERAL> ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">="  
<INTEGER_LITERAL> ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" ":" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "?" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "db:" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" <IDENTIFIER> "." ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "(" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "LENGTH" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "LOCATE" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "ABS" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "SQRT" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "MOD" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "SIZE" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "AVG" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "MAX" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "MIN" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "SUM" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "COUNT" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "SELECT" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "ANY" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "SOME" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "ALL" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "<" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "<=" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "<>" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" <STRING_LITERAL> ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "CONCAT" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "SUBSTRING" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "TRIM" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "LOWER" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "UPPER" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "CURRENT_DATE" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "CURRENT_TIME" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">="  
"CURRENT_TIMESTAMP" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "NOT" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "BETWEEN" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "LIKE" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "IN" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "IS" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "MEMBER" ...
      [java]
      [java] 	at  
org 
.apache.cayenne.ejbql.parser.EJBQL.generateParseException(EJBQL.java: 
9409)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.jj_consume_token(EJBQL.java:9286)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.conditional_primary(EJBQL.java: 
1931)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.conditional_factor(EJBQL.java: 
1909)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.conditional_term(EJBQL.java:1774)
      [java] 	at  
org 
.apache.cayenne.ejbql.parser.EJBQL.conditional_expression(EJBQL.java: 
1736)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.conditional_primary(EJBQL.java: 
1926)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.conditional_factor(EJBQL.java: 
1909)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.conditional_term(EJBQL.java:1774)
      [java] 	at  
org 
.apache.cayenne.ejbql.parser.EJBQL.conditional_expression(EJBQL.java: 
1736)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.conditional_primary(EJBQL.java: 
1926)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.conditional_factor(EJBQL.java: 
1909)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.conditional_term(EJBQL.java:1774)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.conditional_term(EJBQL.java:1787)
      [java] 	at  
org 
.apache.cayenne.ejbql.parser.EJBQL.conditional_expression(EJBQL.java: 
1736)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.where_clause(EJBQL.java:1583)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.select_statement(EJBQL.java:67)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.parseQuery(EJBQL.java:39)
      [java] 	at org.apache.cayenne.ejbql.parser.EJBQL 
$EJBQLDefaultParser.compile(EJBQL.java:28)
      [java] 	... 37 more


3)
      [java] query --> SELECT count(a) FROM CourseClass a WHERE  
(a.isDeleted IS NULL) or (a.isDeleted = false)
      [java]
      [java] 14/08/2008 07:23:19  
com.caucho.hessian.server.HessianSkeleton invoke
      [java] WARNING: org.apache.cayenne.CayenneRuntimeException: [v. 
3.0-SNAPSHOT Jul 09 2008 01:28:38] Query exception.
      [java] org.apache.cayenne.CayenneRuntimeException: [v.3.0- 
SNAPSHOT Jul 09 2008 01:28:38] Query exception.
      [java] 	at  
org 
.apache 
.cayenne 
.access 
.DataDomainQueryAction.nextQueryException(DataDomainQueryAction.java: 
551)
      [java] 	at  
org.apache.cayenne.access.DataNode.performQueries(DataNode.java:237)
      [java] 	at  
org 
.apache 
.cayenne 
.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:424)
      [java] 	at org.apache.cayenne.access.DataDomainQueryAction.access 
$0(DataDomainQueryAction.java:403)
      [java] 	at org.apache.cayenne.access.DataDomainQueryAction 
$2.transform(DataDomainQueryAction.java:397)
      [java] 	at  
org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java: 
847)
      [java] 	at  
org 
.apache 
.cayenne 
.access 
.DataDomainQueryAction 
.runQueryInTransaction(DataDomainQueryAction.java:394)
      [java] 	at  
org 
.apache 
.cayenne 
.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:120)
      [java] 	at  
org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:740)
      [java] 	at  
org 
.apache 
.cayenne 
.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java: 
317)
      [java] 	at  
org 
.apache 
.cayenne 
.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:96)
      [java] 	at  
org.apache.cayenne.access.DataContext.onQuery(DataContext.java:1336)
      [java] 	at  
org.apache.cayenne.access.DataContext.performQuery(DataContext.java: 
1325)
      [java] 	at  
org.apache.cayenne.DataObjectUtils.objectForQuery(DataObjectUtils.java: 
274)
      [java] 	at  
ish.persistence.StatsQuery.queryResult(StatsQuery.java:167)
      [java] Caused by: org.apache.cayenne.ejbql.EJBQLException: [v. 
3.0-SNAPSHOT Jul 09 2008 01:28:38] Invalid identification variable: null

with regards,
--

Lachlan Deck


Re: ObjEntity.translateToDbPath

Posted by Andrus Adamchik <an...@objectstyle.org>.
On Aug 13, 2008, at 11:42 PM, Lachlan Deck wrote:

> (a.isDeleted = null)

A possible problem. Unlike Cayenne expressions, EJBQL does not support  
"= null", it requires "IS NULL" instead. Pretty stupid :-/

Andrus


Re: ObjEntity.translateToDbPath

Posted by Lachlan Deck <la...@gmail.com>.
On 13/08/2008, at 8:17 PM, Andrus Adamchik wrote:

> On Aug 13, 2008, at 11:05 AM, Lachlan Deck wrote:
>
>> I get the following complaining about the asterix '*'. Is that a bug?
>
> No this is not a bug. This is a spec feature. Do "count(a)" instead.

I've tried this also. I've got a class (StatsQuery extends  
IndirectQuery) and the method of interest looks like this:
public Number queryResult(ObjectContext oc) {
	ObjEntity objEntity = oc.getEntityResolver().getObjEntity(entityName);
	if (objEntity == null)
		throw new CayenneRuntimeException("No ObjEntity is mapped for java  
class: " + this.objClass.getName());
	
	StringBuilder query = new StringBuilder("SELECT  
").append(this.statsType).append("(");
	if (this.attributeName != null && !"*".equals(this.attributeName))
		query.append(this.attributeName);
	else
		query.append("a");
	query.append(") FROM ").append(objEntity.getName()).append(" a");
	if (this.expression != null) {
		query.append(" WHERE ").append(this.expression.toEJBQL("a"));
	}
	logger.warn("query --> " + query);
	EJBQLQuery ejbqlQuery = new EJBQLQuery(query.toString());
	return (Number) DataObjectUtils.objectForQuery(oc, ejbqlQuery);
}

I get the following stack traces (from three different queries)..
1)
query --> SELECT count(a) FROM CourseClass a WHERE (a.isDeleted =  
null) or (a.isDeleted = false)
      [java]
      [java] 14/08/2008 06:35:19  
com.caucho.hessian.server.HessianSkeleton invoke
      [java] WARNING: org.apache.cayenne.CayenneRuntimeException: [v. 
3.0-SNAPSHOT Jul 09 2008 01:28:38] Query exception.
      [java] org.apache.cayenne.CayenneRuntimeException: [v.3.0- 
SNAPSHOT Jul 09 2008 01:28:38] Query exception.
      [java] 	at  
org 
.apache 
.cayenne 
.access 
.DataDomainQueryAction.nextQueryException(DataDomainQueryAction.java: 
551)
      [java] 	at  
org.apache.cayenne.access.DataNode.performQueries(DataNode.java:237)
      [java] 	at  
org 
.apache 
.cayenne 
.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:424)
      [java] 	at org.apache.cayenne.access.DataDomainQueryAction.access 
$0(DataDomainQueryAction.java:403)
      [java] 	at org.apache.cayenne.access.DataDomainQueryAction 
$2.transform(DataDomainQueryAction.java:397)
      [java] 	at  
org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java: 
847)
      [java] 	at  
org 
.apache 
.cayenne 
.access 
.DataDomainQueryAction 
.runQueryInTransaction(DataDomainQueryAction.java:394)
      [java] 	at  
org 
.apache 
.cayenne 
.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:120)
      [java] 	at  
org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:740)
      [java] 	at  
org 
.apache 
.cayenne 
.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java: 
317)
      [java] 	at  
org 
.apache 
.cayenne 
.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:96)
      [java] 	at  
org.apache.cayenne.access.DataContext.onQuery(DataContext.java:1336)
      [java] 	at  
org.apache.cayenne.access.DataContext.performQuery(DataContext.java: 
1325)
      [java] 	at  
org.apache.cayenne.DataObjectUtils.objectForQuery(DataObjectUtils.java: 
274)
      [java] 	at  
ish.persistence.StatsQuery.queryResult(StatsQuery.java:161)
      [java] 	<...>
      [java] Caused by: org.apache.cayenne.ejbql.EJBQLException: [v. 
3.0-SNAPSHOT Jul 09 2008 01:28:38] Invalid identification variable: null
      [java] 	at  
org 
.apache 
.cayenne 
.access 
.jdbc 
.EJBQLConditionTranslator 
.visitIdentificationVariable(EJBQLConditionTranslator.java:486)
      [java] 	at  
org 
.apache 
.cayenne 
.ejbql 
.parser 
.EJBQLIdentificationVariable.visit(EJBQLIdentificationVariable.java:35)
      [java] 	at  
org.apache.cayenne.ejbql.parser.SimpleNode.visitChild(SimpleNode.java: 
84)
      [java] 	at  
org 
.apache.cayenne.ejbql.parser.EJBQLEquals.visitChild(EJBQLEquals.java:40)
      [java] 	at  
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:64)
      [java] 	at  
org.apache.cayenne.ejbql.parser.SimpleNode.visitChild(SimpleNode.java: 
84)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQLOr.visitChild(EJBQLOr.java:40)
      [java] 	at  
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:64)
      [java] 	at  
org 
.apache 
.cayenne 
.access.jdbc.EJBQLJoinAppender.appendTable(EJBQLJoinAppender.java:193)
      [java] 	at  
org 
.apache 
.cayenne 
.access 
.jdbc.EJBQLFromTranslator.visitFromItem(EJBQLFromTranslator.java:64)
      [java] 	at  
org 
.apache 
.cayenne.ejbql.parser.EJBQLFromItem.visitNode(EJBQLFromItem.java:89)
      [java] 	at  
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:60)
      [java] 	at  
org.apache.cayenne.ejbql.parser.SimpleNode.visitChild(SimpleNode.java: 
84)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQLFrom.visitChild(EJBQLFrom.java:40)
      [java] 	at  
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:64)
      [java] 	at  
org 
.apache 
.cayenne 
.access 
.jdbc.EJBQLSelectTranslator.visitFrom(EJBQLSelectTranslator.java:56)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQLFrom.visitNode(EJBQLFrom.java:35)
      [java] 	at  
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:60)
      [java] 	at  
org.apache.cayenne.ejbql.parser.SimpleNode.visitChild(SimpleNode.java: 
84)
      [java] 	at  
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:64)
      [java] 	at org.apache.cayenne.access.jdbc.EJBQLAction 
$1.visitSelect(EJBQLAction.java:73)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQLSelect.visitNode(EJBQLSelect.java: 
35)
      [java] 	at  
org.apache.cayenne.ejbql.parser.SimpleNode.visit(SimpleNode.java:60)
      [java] 	at  
org 
.apache.cayenne.access.jdbc.EJBQLAction.performAction(EJBQLAction.java: 
67)
      [java] 	at  
org 
.apache 
.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java: 
58)
      [java] 	at  
org.apache.cayenne.access.DataNode.performQueries(DataNode.java:230)
      [java] 	... 41 more

2)
      [java] query --> SELECT count(a) FROM CourseClass a WHERE  
((a.isDeleted = null) or (a.isDeleted = false)) and ((a.endDateTime >=  
Thu Aug 14 00:00:00 EST 2008) or (a.endDateTime = null)) and  
(a.isCancelled != true)
      [java]
      [java] 14/08/2008 06:35:19  
com.caucho.hessian.server.HessianSkeleton invoke
      [java] WARNING: org.apache.cayenne.ejbql.EJBQLException: [v.3.0- 
SNAPSHOT Jul 09 2008 01:28:38] Error parsing EJB QL statement
      [java] org.apache.cayenne.ejbql.EJBQLException: [v.3.0-SNAPSHOT  
Jul 09 2008 01:28:38] Error parsing EJB QL statement
      [java] 	at org.apache.cayenne.ejbql.parser.EJBQL 
$EJBQLDefaultParser.compile(EJBQL.java:31)
      [java] 	at  
org.apache.cayenne.query.EJBQLQuery.getExpression(EJBQLQuery.java:86)
      [java] 	at  
org 
.apache 
.cayenne.query.EJBQLQueryMetadata.resolve(EJBQLQueryMetadata.java:45)
      [java] 	at  
org.apache.cayenne.query.EJBQLQuery.getMetaData(EJBQLQuery.java:52)
      [java] 	at  
org 
.apache 
.cayenne 
.util.ObjectContextQueryAction.<init>(ObjectContextQueryAction.java:79)
      [java] 	at  
org 
.apache 
.cayenne 
.access.DataContextQueryAction.<init>(DataContextQueryAction.java:49)
      [java] 	at  
org.apache.cayenne.access.DataContext.onQuery(DataContext.java:1336)
      [java] 	at  
org.apache.cayenne.access.DataContext.performQuery(DataContext.java: 
1325)
      [java] 	at  
org.apache.cayenne.DataObjectUtils.objectForQuery(DataObjectUtils.java: 
274)
      [java] 	at  
ish.persistence.StatsQuery.queryResult(StatsQuery.java:161)
      [java] 	<...>
      [java] Caused by:  
org.apache.cayenne.ejbql.parser.ParseException: Encountered "a .  
endDateTime >= Thu Aug" at line 1, column 96.
      [java] Was expecting one of:
      [java]     "(" ...
      [java]     "NOT" ...
      [java]     "+" ...
      [java]     "-" ...
      [java]     <DECIMAL_LITERAL> ...
      [java]     <INTEGER_LITERAL> ...
      [java]     ":" ...
      [java]     "?" ...
      [java]     "db:" ...
      [java]     <IDENTIFIER> "." "NEW" ...
      [java]     <IDENTIFIER> "." "ALL" ...
      [java]     <IDENTIFIER> "." "ANY" ...
      [java]     <IDENTIFIER> "." "EXISTS" ...
      [java]     <IDENTIFIER> "." "SOME" ...
      [java]     <IDENTIFIER> "." "EMPTY" ...
      [java]     <IDENTIFIER> "." "ASC" ...
      [java]     <IDENTIFIER> "." "DESC" ...
      [java]     <IDENTIFIER> "." "ORDER" ...
      [java]     <IDENTIFIER> "." "IS" ...
      [java]     <IDENTIFIER> "." "MEMBER" ...
      [java]     <IDENTIFIER> "." "OF" ...
      [java]     <IDENTIFIER> "." "LIKE" ...
      [java]     <IDENTIFIER> "." "ESCAPE" ...
      [java]     <IDENTIFIER> "." "BETWEEN" ...
      [java]     <IDENTIFIER> "." "NULL" ...
      [java]     <IDENTIFIER> "." "AVG" ...
      [java]     <IDENTIFIER> "." "MIN" ...
      [java]     <IDENTIFIER> "." "MAX" ...
      [java]     <IDENTIFIER> "." "SUM" ...
      [java]     <IDENTIFIER> "." "COUNT" ...
      [java]     <IDENTIFIER> "." "OR" ...
      [java]     <IDENTIFIER> "." "AND" ...
      [java]     <IDENTIFIER> "." "NOT" ...
      [java]     <IDENTIFIER> "." "CONCAT" ...
      [java]     <IDENTIFIER> "." "SUBSTRING" ...
      [java]     <IDENTIFIER> "." "TRIM" ...
      [java]     <IDENTIFIER> "." "LOWER" ...
      [java]     <IDENTIFIER> "." "UPPER" ...
      [java]     <IDENTIFIER> "." "LEADING" ...
      [java]     <IDENTIFIER> "." "TRAILING" ...
      [java]     <IDENTIFIER> "." "BOTH" ...
      [java]     <IDENTIFIER> "." "LENGTH" ...
      [java]     <IDENTIFIER> "." "LOCATE" ...
      [java]     <IDENTIFIER> "." "ABS" ...
      [java]     <IDENTIFIER> "." "SQRT" ...
      [java]     <IDENTIFIER> "." "MOD" ...
      [java]     <IDENTIFIER> "." "SIZE" ...
      [java]     <IDENTIFIER> "." "CURRENT_DATE" ...
      [java]     <IDENTIFIER> "." "CURRENT_TIME" ...
      [java]     <IDENTIFIER> "." "CURRENT_TIMESTAMP" ...
      [java]     <IDENTIFIER> "." "SELECT" ...
      [java]     <IDENTIFIER> "." "DISTINCT" ...
      [java]     <IDENTIFIER> "." "FROM" ...
      [java]     <IDENTIFIER> "." "UPDATE" ...
      [java]     <IDENTIFIER> "." "DELETE" ...
      [java]     <IDENTIFIER> "." "WHERE" ...
      [java]     <IDENTIFIER> "." "GROUP" ...
      [java]     <IDENTIFIER> "." "BY" ...
      [java]     <IDENTIFIER> "." "HAVING" ...
      [java]     <IDENTIFIER> "." "AS" ...
      [java]     <IDENTIFIER> "." "LEFT" ...
      [java]     <IDENTIFIER> "." "OUTER" ...
      [java]     <IDENTIFIER> "." "INNER" ...
      [java]     <IDENTIFIER> "." "JOIN" ...
      [java]     <IDENTIFIER> "." "FETCH" ...
      [java]     <IDENTIFIER> "." "IN" ...
      [java]     <IDENTIFIER> "." "SET" ...
      [java]     <IDENTIFIER> "." "OBJECT" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "." ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "*" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "/" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "+" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "-" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ")" ...
      [java]     <STRING_LITERAL> ...
      [java]     "SELECT" ...
      [java]     "EXISTS" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "=" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "+" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "-" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">="  
<DECIMAL_LITERAL> ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">="  
<INTEGER_LITERAL> ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" ":" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "?" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "db:" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" <IDENTIFIER> "." ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "(" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "LENGTH" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "LOCATE" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "ABS" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "SQRT" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "MOD" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "SIZE" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "AVG" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "MAX" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "MIN" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "SUM" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "COUNT" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "SELECT" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "ANY" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "SOME" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "ALL" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "<" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "<=" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "<>" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" <STRING_LITERAL> ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "CONCAT" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "SUBSTRING" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "TRIM" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "LOWER" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "UPPER" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "CURRENT_DATE" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">=" "CURRENT_TIME" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> ">="  
"CURRENT_TIMESTAMP" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "NOT" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "BETWEEN" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "LIKE" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "IN" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "IS" ...
      [java]     <IDENTIFIER> "." <IDENTIFIER> "MEMBER" ...
      [java]
      [java] 	at  
org 
.apache.cayenne.ejbql.parser.EJBQL.generateParseException(EJBQL.java: 
9409)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.jj_consume_token(EJBQL.java:9286)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.conditional_primary(EJBQL.java: 
1931)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.conditional_factor(EJBQL.java: 
1909)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.conditional_term(EJBQL.java:1774)
      [java] 	at  
org 
.apache.cayenne.ejbql.parser.EJBQL.conditional_expression(EJBQL.java: 
1736)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.conditional_primary(EJBQL.java: 
1926)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.conditional_factor(EJBQL.java: 
1909)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.conditional_term(EJBQL.java:1774)
      [java] 	at  
org 
.apache.cayenne.ejbql.parser.EJBQL.conditional_expression(EJBQL.java: 
1736)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.conditional_primary(EJBQL.java: 
1926)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.conditional_factor(EJBQL.java: 
1909)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.conditional_term(EJBQL.java:1774)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.conditional_term(EJBQL.java:1787)
      [java] 	at  
org 
.apache.cayenne.ejbql.parser.EJBQL.conditional_expression(EJBQL.java: 
1736)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.where_clause(EJBQL.java:1583)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.select_statement(EJBQL.java:67)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.parseQuery(EJBQL.java:39)
      [java] 	at org.apache.cayenne.ejbql.parser.EJBQL 
$EJBQLDefaultParser.compile(EJBQL.java:28)
      [java] 	... 37 more

And if I regex replace '= null' with 'IS NULL' and '!= null' with 'IS  
NOT NULL' problems persist. It also doesn't like false and true  
obviously.... so it seems to me that expression.toEJBQL("a") is not  
transforming to a usable expression? i.e., it's not transforming it to  
something that succeeds in parsing when performing the query.

Any clues?
Thanks.

with regards,
--

Lachlan Deck


Re: ObjEntity.translateToDbPath

Posted by Andrus Adamchik <an...@objectstyle.org>.
On Aug 13, 2008, at 11:05 AM, Lachlan Deck wrote:

> I get the following complaining about the asterix '*'. Is that a bug?

No this is not a bug. This is a spec feature. Do "count(a)" instead.

Andrus


Re: ObjEntity.translateToDbPath

Posted by Lachlan Deck <la...@gmail.com>.
On 13/08/2008, at 5:29 PM, Lachlan Deck wrote:

> On 13/08/2008, at 5:17 PM, Lachlan Deck wrote:
>
>> Hi there,
>>
>> Just wondering why the above produces stuff like (db:isDeleted =  
>> null) rather than (isDeleted = null)?
>> The former obviously can't be evaluated against the database.
>
> Sorry - better question: what's the recommended way of taking an  
> Expression (on the server side) and converting to an sql equivalent  
> (doing all the relevant transformations for types and operators etc)?

I'm creating an EJBQLQuery as follows...

StringBuilder ejbqlBuff = new StringBuilder();
ejbqlBuff.append("SELECT " + this.statsType + "(" + dbAttributeName +  
") FROM ").append(dbEntity.getName()).append(" a");
if (expression != null) {
	ejbqlBuff.append(" WHERE ").append(expression.toEJBQL("a"));
}
// buff equals for example: SELECT count(*) FROM CourseClass a WHERE  
(a.isDeleted = null) or (a.isDeleted = false)

DataObjectUtils.objectForQuery(new EJBQLQuery(ejbqlBuff.toString()));

I get the following complaining about the asterix '*'. Is that a bug?

      [java]
      [java] 13/08/2008 17:57:29  
com.caucho.hessian.server.HessianSkeleton invoke
      [java] WARNING: org.apache.cayenne.ejbql.EJBQLException: [v.3.0- 
SNAPSHOT Jul 09 2008 01:28:38] Error parsing EJB QL statement
      [java] org.apache.cayenne.ejbql.EJBQLException: [v.3.0-SNAPSHOT  
Jul 09 2008 01:28:38] Error parsing EJB QL statement
      [java] 	at org.apache.cayenne.ejbql.parser.EJBQL 
$EJBQLDefaultParser.compile(EJBQL.java:31)
      [java] 	at  
org.apache.cayenne.query.EJBQLQuery.getExpression(EJBQLQuery.java:86)
      [java] 	at  
org 
.apache 
.cayenne.query.EJBQLQueryMetadata.resolve(EJBQLQueryMetadata.java:45)
      [java] 	at  
org.apache.cayenne.query.EJBQLQuery.getMetaData(EJBQLQuery.java:52)
      [java] 	at  
org.apache.cayenne.query.IndirectQuery.getMetaData(IndirectQuery.java: 
43)
      [java] 	at  
org 
.apache 
.cayenne 
.util.ObjectContextQueryAction.<init>(ObjectContextQueryAction.java:79)
      [java] 	at  
org 
.apache 
.cayenne 
.access.DataContextQueryAction.<init>(DataContextQueryAction.java:49)
      [java] 	at  
org.apache.cayenne.access.DataContext.onQuery(DataContext.java:1336)
      [java] 	at  
org.apache.cayenne.access.DataContext.performQuery(DataContext.java: 
1325)
      [java] 	at  
org.apache.cayenne.DataObjectUtils.objectForQuery(DataObjectUtils.java: 
274)
      [java] 	at  
ish.persistence.StatsQuery.queryResult(StatsQuery.java:127)
      [java] 	at ish.persistence.StatsQuery.intResult(StatsQuery.java: 
116)
      [java] 	at  
ish 
.oncourse 
.server 
.AngelServerQueryServiceImpl 
.getIntResult(AngelServerQueryServiceImpl.java:27)
      [java] 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native  
Method)
      [java] 	at  
sun 
.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 
39)
      [java] 	at  
sun 
.reflect 
.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 
25)
      [java] 	at java.lang.reflect.Method.invoke(Method.java:585)
      [java] 	at  
com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java: 
180)
      [java] 	at  
com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java: 
109)
      [java] 	at  
com.caucho.hessian.server.HessianServlet.service(HessianServlet.java: 
396)
      [java] 	at  
org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
      [java] 	at org.mortbay.jetty.servlet.ServletHandler 
$CachedChain.doFilter(ServletHandler.java:1097)
      [java] 	at  
ish.oncourse.server.SecurityFilter.doFilter(SecurityFilter.java:57)
      [java] 	at org.mortbay.jetty.servlet.ServletHandler 
$CachedChain.doFilter(ServletHandler.java:1088)
      [java] 	at  
org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
      [java] 	at  
org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java: 
216)
      [java] 	at  
org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
      [java] 	at  
org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
      [java] 	at  
org 
.mortbay 
.jetty 
.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java: 
206)
      [java] 	at  
org 
.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java: 
114)
      [java] 	at  
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
      [java] 	at org.mortbay.jetty.Server.handle(Server.java:324)
      [java] 	at  
org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
      [java] 	at org.mortbay.jetty.HttpConnection 
$RequestHandler.content(HttpConnection.java:843)
      [java] 	at  
org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:729)
      [java] 	at  
org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:205)
      [java] 	at  
org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
      [java] 	at org.mortbay.jetty.bio.SocketConnector 
$Connection.run(SocketConnector.java:228)
      [java] 	at org.mortbay.thread.QueuedThreadPool 
$PoolThread.run(QueuedThreadPool.java:488)
      [java] Caused by:  
org.apache.cayenne.ejbql.parser.ParseException: Encountered "*" at  
line 1, column 14.
      [java] Was expecting one of:
      [java]     "+" ...
      [java]     "-" ...
      [java]     <DECIMAL_LITERAL> ...
      [java]     <INTEGER_LITERAL> ...
      [java]     ":" ...
      [java]     "?" ...
      [java]     "db:" ...
      [java]     <IDENTIFIER> ...
      [java]     "(" ...
      [java]     "LENGTH" ...
      [java]     "LOCATE" ...
      [java]     "ABS" ...
      [java]     "SQRT" ...
      [java]     "MOD" ...
      [java]     "SIZE" ...
      [java]     "AVG" ...
      [java]     "MAX" ...
      [java]     "MIN" ...
      [java]     "SUM" ...
      [java]     "COUNT" ...
      [java]     "SELECT" ...
      [java]     "DISTINCT" ...
      [java]
      [java] 	at  
org 
.apache.cayenne.ejbql.parser.EJBQL.generateParseException(EJBQL.java: 
9409)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.jj_consume_token(EJBQL.java:9286)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.aggregate_path(EJBQL.java:1384)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.count(EJBQL.java:1438)
      [java] 	at  
org 
.apache 
.cayenne.ejbql.parser.EJBQL.aggregate_select_expression(EJBQL.java:1331)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.select_expression(EJBQL.java:1016)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.select_expressions(EJBQL.java:969)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.select_clause(EJBQL.java:904)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.select_statement(EJBQL.java:63)
      [java] 	at  
org.apache.cayenne.ejbql.parser.EJBQL.parseQuery(EJBQL.java:39)
      [java] 	at org.apache.cayenne.ejbql.parser.EJBQL 
$EJBQLDefaultParser.compile(EJBQL.java:28)
      [java] 	... 38 more

with regards,
--

Lachlan Deck




Re: ObjEntity.translateToDbPath

Posted by Lachlan Deck <la...@gmail.com>.
On 13/08/2008, at 5:17 PM, Lachlan Deck wrote:

> Hi there,
>
> Just wondering why the above produces stuff like (db:isDeleted =  
> null) rather than (isDeleted = null)?
> The former obviously can't be evaluated against the database.

Sorry - better question: what's the recommended way of taking an  
Expression (on the server side) and converting to an sql equivalent  
(doing all the relevant transformations for types and operators etc)?

Thanks.

with regards,
--

Lachlan Deck