FYI progress made today. I have successfully implemented a custom EJBSQL generator and am mainly getting stuff working.
One question: is there a valid way to express that a relationship should be an outer join instead of inner? I'm not finding any docs about this. For example: SELECT a.name,COUNT(b) FROM Artist AS a, IN (a.paintings) AS b WHERE b.year BETWEEN 1800 AND 1900 GROUP BY a.name I want an Artist with 0 paintings from the years 1800-1900 to still come through as a result. Right now of course, it is not because the inner join removes that artist from consideration. So close.. Thanks again for the help-- Dave On Fri, Dec 4, 2009 at 10:09 AM, Dave Lamy <[email protected]> wrote: > So one problem that I now understand is that EJBQL doesn't support > navigating over to-many collections inline, so "foo.productStyles.taxonomy" > would be invalid. In order to do that you have to do this whole > "IN(foo.productStyles) styles" bit in the FROM clause, at least according to > the specs. > > I don't know if this is causing the parse problem or not.. but it does > render the Expression.toEJBQL() rather useless. I would need to do my own > FROM/WHERE clause generation. > > I'll plug away at this and will let you know what I find out.. > > Dave > > > On Fri, Dec 4, 2009 at 8:09 AM, Dave Lamy <[email protected]> wrote: > >> I can get rid of the likeIgnoreCase and see what happens. So I'm OK on >> the alias part right? In my other tests it didn't need an "as". I've >> mainly been concerned about whether that "doublehop" >> (.productStyles.taxonomy) would be valid or not. >> >> FYI that popped straight out of an Expression.toEJBSQL(). Not sure how >> best to handle situations like that, where the Expression supports a notion >> that EJBSQL does not. >> >> On Fri, Dec 4, 2009 at 7:31 AM, Andrus Adamchik >> <[email protected]>wrote: >> >>> "likeIgnoreCase" is not valid in EJBQL. Although the error message refers >>> to something else... strange... >>> >>> >>> >>> On Dec 4, 2009, at 4:12 AM, Dave Lamy wrote: >>> >>> Hey guys-- >>>> >>>> I'm really just now getting into using the EJBQLQuery and am having some >>>> difficulties. I don't know whether I'm doing something fundamentally >>>> wrong >>>> or what. >>>> >>>> Here's my EJBQL expression that I'm trying to get parsed (running >>>> 3.0B1): >>>> >>>> select COUNT(foo) from ProductCollection foo where >>>> foo.productStyles.taxonomy likeIgnoreCase '323.%' >>>> >>>> Parsing this query yields the following exception: >>>> >>>> >>>> org.apache.cayenne.ejbql.parser.ParseException: Encountered " >>>> <IDENTIFIER> >>>> "foo "" at line 1, column 53. >>>> Was expecting: >>>> "(" ... >>>> >>>> at >>>> >>>> org.apache.cayenne.ejbql.parser.EJBQL.generateParseException(EJBQL.java:9419) >>>> at >>>> org.apache.cayenne.ejbql.parser.EJBQL.jj_consume_token(EJBQL.java:9298) >>>> at >>>> >>>> org.apache.cayenne.ejbql.parser.EJBQL.conditional_primary(EJBQL.java:1933) >>>> at >>>> >>>> org.apache.cayenne.ejbql.parser.EJBQL.conditional_factor(EJBQL.java:1911) >>>> at >>>> org.apache.cayenne.ejbql.parser.EJBQL.conditional_term(EJBQL.java:1776) >>>> at >>>> >>>> org.apache.cayenne.ejbql.parser.EJBQL.conditional_expression(EJBQL.java:1738) >>>> at >>>> >>>> org.apache.cayenne.ejbql.parser.EJBQL.conditional_primary(EJBQL.java:1928) >>>> at >>>> >>>> org.apache.cayenne.ejbql.parser.EJBQL.conditional_factor(EJBQL.java:1911) >>>> at >>>> org.apache.cayenne.ejbql.parser.EJBQL.conditional_term(EJBQL.java:1776) >>>> at >>>> >>>> org.apache.cayenne.ejbql.parser.EJBQL.conditional_expression(EJBQL.java:1738) >>>> at org.apache.cayenne.ejbql.parser.EJBQL.where_clause(EJBQL.java:1585) >>>> at >>>> org.apache.cayenne.ejbql.parser.EJBQL.select_statement(EJBQL.java:69) >>>> at org.apache.cayenne.ejbql.parser.EJBQL.parseQuery(EJBQL.java:41) >>>> ... >>>> >>>> The statement looks legit to me. Is there like a fundamental something >>>> I'm >>>> not understanding about EJBQL? I saw some docs that showed doing this >>>> sort >>>> of join alias "IN" thing, >>>> >>>> SELECT OBJECT(e) FROM Department d, IN(d.employees) e >>>> WHERE d.name = ?1 AND e.salary > ?2 >>>> >>>> My problem is that I'm using Expression.toEJBQL() to gen the where >>>> clause.. >>>> was hoping to not have to recreate my code that generates the Expression >>>> object. >>>> >>>> Help! >>>> >>>> Dave >>>> >>> >>> >> >
