Finder methods, named queries and relations
-------------------------------------------

         Key: EJB-35
         URL: http://jira.andromda.org/browse/EJB-35
     Project: EJB Cartridge
        Type: Improvement

    Reporter: Sverker Abrahamsson
 Assigned to: Vance Karimi 
    Priority: Trivial
 Attachments: andromda-all.patch

Most of my queries involve related classes. For example, I have an entity 
Subscription with a 0-n relation to entity User and a n-1 relation to entity 
Channel. I want a finder method which returns all channels a given user is 
subscribed to, without having to load neither the User nor the Subscription 
entities (this is a quite trivial example, there are more complicated cases 
where the difference acctually affects performance).

So I create a finder method in Channel called findSubscribedChannels(String 
msisdn) where msisdn is primary key of User entity. This finder method should 
return a collection of channels the given user is subscribed to.

The generated query is of course not correct but I thought it sholdn't be a 
problem as I could override it in the DaoImpl class, but the problem is that 
since it's created as a named query then JBoss verifies it when the application 
is deployed and fails since Channel doesn't have any field named msisdn.

As the doc indicated that there are no possibility to override the generated 
query except by creating a OCL query, I started to ponder how to solve this 
issue (I later found that @andromda.ejb.query tagged value does work countrary 
to what the doc says). I thought that if I instead specified the signature as 
findSubscribedChannels(String subscriptions.user.msisdn) (where subscriptions 
and user are the respective relation names) then the query generator could 
detect that this finder argument refers to a field in a related entity. It 
acctually worked out very conveniently. For this finder method a query like 
this is generated:

    select channel from Channel as channel inner join channel.subscriptions as 
subscription where   
    subscription.user.msisdn = :subscriptionsUserMsisdn

Hence as long as just a simple query is neccesary then nothing else than 
specifying the finder parameters results in a working query even when the query 
involves several related enties.

To make it work I had to do a patch also for the main andromda project as the 
signature of a finder method is created there  but unless a operation parameter 
name is allowed to have dot's in some context (I can't think of any) it 
shouldn't affect anything negatively.

Now that I found out that I can override the named query with 
@andromda.ejb.query maybe this patch isn't that neccesary but I still find it 
convenient as it makes it visible directly in the model which attributes are 
involved in the search.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://jira.andromda.org/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642

Reply via email to