Christian,
There is no way that I know of to specify additional qualifiers to Cayenne's
built in relationships. The design is that getPrices should return all prices
where Price.article field has been set to that article.
What you can do is add your own method getCurrentPrices that returns all
non-historic prices. This could either explicitly run a query looking for
Article.articleID = Price.articleID and Price.historic is false or null. Or you
can filter though the list of all Prices to select the prices which aren't
historic.
The second option has the advantage that it will automatically notice when new
prices are added or old prices are marked as historic.
The first option has the advantage that it doesn't load all prices into memory,
but it doesn't return unsaved current prices. And if the result is cached, it
doesn't reflect any changes.
Joe
On Nov 6, 2011, at 8:04 AM, Christian Grobmeier wrote:
> Hi all,
>
> I have two tables Article and Price.
> The table Price can containt historic prices which should not be selected.
>
> I do something like that:
>
> Expression expression = ExpressionFactory.matchExp("prices.historic", false);
> Expression fullExp =
> expression.orExp(ExpressionFactory.matchExp("prices+.historic",
> null));
> SelectQuery query = new SelectQuery(Module.class, fullExp);
> List list = ctx.performQuery(query);
>
> This generates a correct sql like:
>
> SELECT DISTINCT t0....*
> FROM articles t0
> LEFT JOIN prices t1 ON (t0.id = t1.article_id)
> WHERE (t1.historic = false) OR (t1.historic IS NULL)
>
> Using that sql works well on my MySQL db directly.
>
> When I run Cayenne, my junit test case fails because I when I call
> getPrices() I get even the historic ones.
>
> For example:
>
> List list = ctx.performQuery(query);
> Article a = (Article)list.get(0);
> a.getPrices(); // <--- returns historic true/false
>
> I had the expectation that the historic prices should not appear here.
> Do I miss something?
>
> Cheers,
> Christian