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:[EMAIL PROTECTED]
Gesendet: Freitag, 7. November 2008 21:52
An: [email protected]
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",
>
> [EMAIL PROTECTED](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.