Although this does not seem to be an XDoclet question - it seems more
like an EJB-QL question. . .

Have you tried: 

SELECT OBJECT(u) FROM User AS u WHERE u.phone = ?1

You don't use the name of the getter in EJB-QL, you use the name of
field. (Even though the field doesn't exist directly in your bean.)

There is a fairly good EJB-QL reference at www.ejb-ql.com. Click on the
reference link.


On Tue, 2003-08-05 at 12:55, Philipp W. Kutter wrote:
> Hi, David.
> 
> Thanks for the prompt answer!
> 
> >>2. Phone and User have a 1:N relationship. Each P has a U, and thus a U
> >>    
> >>
> >
> >  
> >
> >>  also has many Ps that consider them as their U.
> >>
> >>Now I would like to make a finder method on phones, where I select
> >>    
> >>
> >those 
> >  
> >
> >>(the single one in fact) having a certain user:
> >>    
> >>
> >
> >[One correction: you'll get many phones for any given user as it is U
> >1:N P.]
> >  
> >
> Yes, and one user for any given phone, right?
> 
> >You cannot search directly on the CMR field like that, but you're close.
> >You need to create what would effectively be a join in SQL by searching
> >the User bean and relating it to its Phones. There are many ways to do
> >this, and some may be easier, but let's continue with your example.
> >
> >I'm adapting the following EJB-QL from a different set of beans, but
> >here's a first stab at it. The following finds the Phones related to the
> >user (or users) with the given name:
> >
> >  java.util.Collection findPhonesByUserName(java.lang.String name)
> >  SELECT OBJECT(p) FROM User AS u, IN(u.phones) AS p WHERE u.name = ?1
> >
> >  "phones" is the CMR Collection field in User.
> >  "name" is a CMP field in User.
> >  
> >
> This is exactly the kind of example I got working. I even got it working 
> using the PhoneLocal directly,
> I mean:
> 
> java.util.Collection findPhonesByUser(UserLocal user)
>   SELECT OBJECT(p) FROM User AS u, IN(u.phones) AS p WHERE u = ?1
> 
> This is working in my examples. Is there any reason to go for the .name 
> field, instead of
> using the UserLocal directly?
> 
> BUT BACK TO MY QUESTION:
> I was expressing my question wron. Sorry about that.
> I want findUserByPhone, not phonesByUser, as you give me.
> 
> I want:
> 
> java.util.Collection findUserByPhone(PhoneLocal phone)
>   SELECT OBJECT(u) FROM User AS u WHERE u.getPhone = ?1
> 
> 
> Or, if there is a reason I cannot go over PhoneLocal directly, I want:
> 
> java.util.Collection findUserByPhoneId(String phoneId)
>   SELECT OBJECT(u) FROM User AS u WHERE u.getPhone.getId = ?1
> 
> 
> This is what is not working. Why is it not working? How can I do it?
> 
> For me it seems like, I cannot do it, since it is not needed to do it. 
> You always can
> get the user by phone by applying getPhone outside of the EJBQL, and thus
> it is not supported and nobody gives an example.
> 
> Is this understanding right?
> 
> Best, Philipp
> 
> >In SQL, this would be
> >
> >  select p.* from phone p, user u where p.user_id = u.id and u.name =
> >'<value>'
> >
> >If you were searching by user.id instead of user.name (as you would be
> >given your example where you must have found a single User first), you
> >could simply use
> >
> >  UserLocal user = UserLocalHome.findByPrimaryKey(id);
> >  Collection phones = user.getPhones();
> >
> >David Harkness
> >Sony Pictures Digital Networks
> >(310) 482-4756
> >
> >
> >-----Original Message-----
> >From: Philipp W. Kutter [mailto:[EMAIL PROTECTED] 
> >Sent: Tuesday, August 05, 2003 11:05 AM
> >To: [EMAIL PROTECTED]
> >Subject: [Xdoclet-user] Using CMR field with EJBQL
> >
> >
> >Hi, David.
> >
> >I had a second look on your answer, and I think I can formulate my 
> >problem based on
> >the code proposed by you:
> >
> >I would like to know why
> >
> >* @ejb.finder
> >*     signature = "java.util.Collection findPhoneOfUser(UserLocal user)"
> >*     query = "SELECT OBJECT(p) FROM phone p  WHERE p.getUser = ?1 "
> >
> >
> >is not working.
> >
> >In Detail:
> >
> >  
> >
> >>1. User and Phone are entity beans.
> >>2. Phone and User have a 1:N relationship. Each P has a U, and thus a U
> >>    
> >>
> >
> >  
> >
> >>also has
> >>  many Ps that consider them as their U.
> >>3. The User table has a PK column called id.
> >>4. The Phone table has a FK column called user.
> >>
> >>If those are all correct, then you need to change your xdoclet tags to 
> >>specify a relationship instead of a field. For example, for User <-- 
> >>1:N
> >>--> Phones, here are the tags I use in UserEJB.java:
> >>
> >> /**
> >>  * @ejb.interface-method
> >>  * @ejb.transaction type="Supports"
> >>  * @ejb.relation
> >>  *      name="User-Phone"
> >>  *      role-name="User-has-many-Phones"
> >>  *      cascade-delete="no"
> >>  */
> >> public abstract Collection getPhones ( ) ;
> >> public abstract void setPhones ( Collection phones ) ;
> >>
> >>And in PhoneEJB.java:
> >>
> >> /**
> >>  * @ejb.interface-method
> >>  *      view-type="local"
> >>  * @ejb.transaction type="Supports"
> >>  * @ejb.relation
> >>  *      name="User-Phone"
> >>  *      role-name="Phones-have-a-User"
> >>  *      cascade-delete="yes"
> >>  * @weblogic.column-map
> >>  *      foreign-key-column="user_id"
> >>  *      key-column="id"
> >>  */
> >> public abstract UserLocal getUser ( ) ;
> >>
> >> /**
> >>  */
> >> public abstract void setUser ( UserLocal user ) ;
> >>
> >>This is for a bidirectional relationship, so both beans know about and 
> >>can find each other via relationships and in finder queries. I also 
> >>added a helper method so I could hook a Phone up to a User given only 
> >>the User's ID:
> >>
> >> /**
> >>  * Attaches this phone to the user with the given ID.
> >>  *
> >>  * @param   userId    unique ID of the owning user
> >>  */
> >> protected void setLocalUserId ( Integer userId )
> >> {
> >>   try {
> >>     setUser(UserUtil.getLocalHome().findByPrimaryKey(userId));
> >>   }
> >>   catch ( NamingException e ) {
> >>     throw new ServiceException("Failure looking up user home", e);
> >>   }
> >>   catch ( FinderException e ) {
> >>     throw new ServiceException("Failure finding a user", e);
> >>   }
> >> }
> >>
> >>First of all, is this where you were going with this?
> >>
> >>    
> >>
> >Yes, this is what I am going to, adapted to your Phone/User example.
> >
> >Now I would like to make a finder method on phones, where I select those
> >
> >(the single one in fact) having a certain
> >user:
> >
> >* @ejb.finder
> >*     signature = "java.util.Collection findPhoneOfUser(UserLocal user)"
> >*     query = "SELECT OBJECT(p) FROM phone p  WHERE p.getUser = ?1 "
> >
> >
> >This is not working in my examples. Why?
> >
> >Best, and thanks again, Philipp
> >
> >
> >
> >
> >-------------------------------------------------------
> >This SF.Net email sponsored by: Free pre-built ASP.NET sites including
> >Data Reports, E-commerce, Portals, and Forums are available now.
> >Download today and enter to win an XBOX or Visual Studio .NET.
> >http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303_01/01
> >_______________________________________________
> >xdoclet-user mailing list
> >[EMAIL PROTECTED]
> >https://lists.sourceforge.net/lists/listinfo/xdoclet-user
> >  
> >
-- 
Matthew Excell <[EMAIL PROTECTED]>
The Possibility Forge, Inc.

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to