openjpa-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Norbert Rieger" <nrie...@lplusr.de>
Subject AW: JPQL Query with embedded object
Date Sat, 08 Nov 2008 19:05:26 GMT
Hi,

yes, I think this will work for openJPA, I've tried this already.

But it's a workaround (valid only for openJPA ?) with some disadvantages:

- maybe this is not portable (I'm sorry for that, but our application needs
to run on Apache Geronimo and at least on JBoss without openJPA)
- I don't what to have an implementation detail like a protected field
("val") in the query, I think this was not a goal of JPA 
  (I thought we should think about object and not of SQL tables and columns)
- each query has to be changed e.g. if the "val" field gets renamed to
"value" (which is very error prone)

Is this a known bug in openJPA (which delivers with Geronimo 2.1.3) or am I
wrong with my query/understanding of JPA's query language ?

Thanks a lot for your answers.

NR

-----Urspr√ľngliche Nachricht-----
Von: Pinaki Poddar [mailto:ppoddar@apache.org] 
Gesendet: Freitag, 7. November 2008 21:52
An: users@openjpa.apache.org
Betreff: Re: JPQL Query with embedded object


The workaround can be the following:    
MyIdent ownerIdent = new MyIdent ("TEST") ;
Owner    owner = (Owner) em.createQuery("SELECT o FROM Owner o WHERE
o.ident.val =:ident")
                                       .setParameter ("ident",
ownerIdent.getVal())
                                       .getSingleResult () ;

 


nrieger wrote:
> 
> Hi,
> 
>  
> 
> I'm working with Apache Geronimo 2.1.3. 
> 
>  
> 
> I've an embedded object in my entity class.
> 
>  
> 
> Making the entity persistent is no problem, the embedded object works
> fine,
> but when this object is part of a query's where clause it does not work,
> 
> it's converted to "WHERE (1 <> 1)" which (IMHO) is never true.
> 
>  
> 
> This are my classes:
> 
>  
> 
> //
>
----------------------------------------------------------------------------
> 
>       @Embeddable
> 
>       public static class BaseId implements Serializable {
> 
>  
> 
>             private static final long serialVersionUID =
> 7143689378031391420L;
> 
>             
> 
>             protected String val ;
> 
>  
> 
>         ....
> 
>     }
> 
>  
> 
> //
>
----------------------------------------------------------------------------
> 
>       @Embeddable
> 
>       @AttributeOverride(name="val", 
> 
>                          column=@Column(name="ident")) 
> 
>       public static class MyIdent extends BaseId {
> 
>  
> 
>             private static final long serialVersionUID =
> -492669352494445761L;
> 
>       
> 
>             public MyIdent () {
> 
>                super();
> 
>             }
> 
>             public MyIdent (String ident) {
> 
>                super(ident);
> 
>             }
> 
>             
> 
>         ....
> 
>     }
> 
>  
> 
> //
>
----------------------------------------------------------------------------
> 
>     @Entity
> 
>     public class Owner implements OwnerIf, Serializable {
> 
>       
> 
>       private static final long serialVersionUID = 3370703487710772895L;
> 
>       
> 
>         @Id
> 
>         private long pKey;
> 
>  
> 
>         @Embedded
> 
>         private MyIdent ident;
> 
>  
> 
>         
> 
> //
>
----------------------------------------------------------------------------
> 
> This is the Query:
> 
>  
> 
>     MyIdent ownerIdent = new MyIdent ("TEST") ;
> 
>     owner = (Owner) em.createQuery("SELECT o FROM Owner o WHERE o.ident =
> :ident")
> 
>                       .setParameter ("ident", ownerIdent)
> 
>                       .getSingleResult () ;
> 
>  
> 
>  
> 
> And this is the trace:        
> 
> 945980  PersUnit  TRACE  [ejbd 8] openjpa.Query - Executing query: [SELECT
> o
> FROM Owner o WHERE o.ident = ?1] with parameters: {1=TEST}
> 
> 947417  PersUnit  TRACE  [ejbd 8] openjpa.jdbc.SQL - <t 17090750, conn
> 153947> executing prepstmnt 21779345 SELECT t0.pKey, t0.genDate, t0.ident,
> t0.mmd_pkey, t0.smd_pkey FROM Owner t0 WHERE (1 <> 1)
> 
>  
> 
> //
>
----------------------------------------------------------------------------
> 
> If I use the "val" field of MyIdent, the query works. But I think this is
> not was it is supposed to be or is it ? If running on JBoss/Hibernate it
> does not work.
> 
>  
> 
>     MyIdent ownerIdent = new MyIdent ("TEST") ;
> 
>     owner = (Owner) em.createQuery("SELECT o FROM Owner o WHERE
> o.ident.val
> = :val")
> 
>                       .setParameter ("val", ownerIdent.getValue ())
> 
>                       .getSingleResult () ;
> 
>  
> 
>  
> 
> And this is the trace: 
> 
> 179844  PersUnit  TRACE  [ejbd 3] openjpa.Query - Executing query: [SELECT
> o
> FROM Owner o WHERE o.ident.val = :val] with parameters: {val=TEST}
> 
> 181235  PersUnit  TRACE  [ejbd 3] openjpa.jdbc.SQL - <t 25015360, conn
> 14421085> executing prepstmnt 15327648 SELECT t0.pKey, t0.genDate,
> t0.ident,
> t0.mmd_pkey, t0.smd_pkey FROM Owner t0 WHERE (t0.ident = ?)
> [params=(String)
> TEST]
> 
>  
> 
> //
>
----------------------------------------------------------------------------
> 
> What's wrong with my definitions/query ? How do I use an embedded object
> in
> a query ?
> 
>  
> 
> Thanks a lot for your answers.
> 
>  
> 
> NR
> 
>  
> 
> 
> 

-- 
View this message in context:
http://n2.nabble.com/JPQL-Query-with-embedded-object-tp1468925p1471423.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.


Mime
View raw message