left join with filter on joined table

4 messages Options
Embed this post
Permalink
Michel Ganguin-2

left join with filter on joined table

Reply Threaded More More options
Print post
Permalink
Hi,

I have two tables:

patient
-------
id
firstname
lastname

vaccine
-------
id
patientid
date
type

With an ejbqlquery i want to retrieve all patients that have 0 to n vaccines

Select p.firstname, v.type from Patient p left join p.vaccinCollection v

result:
p1, v1
p1, v2
p2, v2
p3, null

Now I want to filter by vaccine type (all patients that have 0 to n
vaccines of type v2):

Select p.firstname, v.type from Patient p left join p.vaccinCollection v
where v.type = 'v2'

result:
p1, v2
p2, v2

But this filtered out patients without vaccine, so i tried:

Select p.firstname, v.type from Patient p left join p.vaccinCollection v
where v.type = 'v2' OR v.type is null

result:
p1, v2
p2, v2
p3, null

This looks like what I want but doesn't work for v1

Select p.firstname, v.type from Patient p left join p.vaccinCollection v
where v.type = 'v1' OR v.type is null

result:
p1, v1
p3, null

I want to have "p2, null" in the result. How can I do that? I'm not
against getting all result (first query) and filter out the unwanted
data but this vaccine table becomes very huge and it sould be a dramatic
performance loss!

Is there a way to avoid post-join-filtering by adding a query hint or
something like this. Or to use parameters in entity relations? If there
is no solution I would use native queries but how can I map join queries
to entities?

Thanks in advance.
Michel Ganguin
Fay Wang

Re: left join with filter on joined table

Reply Threaded More More options
Print post
Permalink
Hi,
   You might want to try:

Select p.firstname,
      Case v.type WHEN 'v1' THEN v.type
                        WHEN 'v2' THEN 'null'
                        ELSE 'null' END " +
       from Patient p left join p.vaccinCollection v

However, this approach still requires post-processing of 'null' string to null value.

Fay



----- Original Message ----
From: Michel Ganguin <[hidden email]>
To: [hidden email]
Sent: Mon, October 26, 2009 10:46:22 AM
Subject: left join with filter on joined table

Hi,

I have two tables:

patient
-------
id
firstname
lastname

vaccine
-------
id
patientid
date
type

With an ejbqlquery i want to retrieve all patients that have 0 to n vaccines

Select p.firstname, v.type from Patient p left join p.vaccinCollection v

result:
p1, v1
p1, v2
p2, v2
p3, null

Now I want to filter by vaccine type (all patients that have 0 to n
vaccines of type v2):

Select p.firstname, v.type from Patient p left join p.vaccinCollection v
where v.type = 'v2'

result:
p1, v2
p2, v2

But this filtered out patients without vaccine, so i tried:

Select p.firstname, v.type from Patient p left join p.vaccinCollection v
where v.type = 'v2' OR v.type is null

result:
p1, v2
p2, v2
p3, null

This looks like what I want but doesn't work for v1

Select p.firstname, v.type from Patient p left join p.vaccinCollection v
where v.type = 'v1' OR v.type is null

result:
p1, v1
p3, null

I want to have "p2, null" in the result. How can I do that? I'm not
against getting all result (first query) and filter out the unwanted
data but this vaccine table becomes very huge and it sould be a dramatic
performance loss!

Is there a way to avoid post-join-filtering by adding a query hint or
something like this. Or to use parameters in entity relations? If there
is no solution I would use native queries but how can I map join queries
to entities?

Thanks in advance.
Michel Ganguin



     
Michel Ganguin

Re: left join with filter on joined table

Reply Threaded More More options
Print post
Permalink
Thanks
This should solve at least a part of my problem, but a cannot make it work. I use opejpa 1.2.1 and it raises a parseexception on such a query. Is "case when" valid in jpql?

Michel

Fay Wang wrote:
Hi,
   You might want to try:

Select p.firstname,
      Case v.type WHEN 'v1' THEN v.type
                        WHEN 'v2' THEN 'null'
                        ELSE 'null' END " +
       from Patient p left join p.vaccinCollection v

However, this approach still requires post-processing of 'null' string to null value.

Fay
Miłosz Tylenda

Re: left join with filter on joined table

Reply Threaded More More options
Print post
Permalink
Michel,

The CASE expression has been introduced in JPA 2. You need OpenJPA 2.0 then, for example the M3 release.

Cheers,
Milosz

>
> Thanks
> This should solve at least a part of my problem, but a cannot make it work.
> I use opejpa 1.2.1 and it raises a parseexception on such a query. Is "case
> when" valid in jpql?
>
> Michel
>
>
> Fay Wang wrote:
> >
> > Hi,
> >    You might want to try:
> >
> > Select p.firstname,
> >       Case v.type WHEN 'v1' THEN v.type
> >                         WHEN 'v2' THEN 'null'
> >                         ELSE 'null' END " +
> >        from Patient p left join p.vaccinCollection v
> >
> > However, this approach still requires post-processing of 'null' string to
> > null value.
> >
> > Fay
> >
>
> --
> View this message in context: http://n2.nabble.com/left-join-with-filter-on-joined-table-tp3893996p3904795.html
> Sent from the OpenJPA Users mailing list archive at Nabble.com.
>