-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 11 posts ] 
Author Message
 Post subject: left outer join when null value is used in where
PostPosted: Fri Oct 31, 2008 11:11 am 
Newbie

Joined: Fri Oct 31, 2008 10:51 am
Posts: 7
Location: Guatemala
i have a BIG problem =(

first i had a query with join, but my values could be null so my query didn't retrieve results with null value, so i changed it for a left outer join and it works, but now when i try to use the object rp in the where query's part it doesn't work T_T

take a look

select object(cl) from Cliente cl left outer join cl.personaJuridica.representantes rp where (cl.personaJuridica.razon social like '%xxx%') or (rp.personaIndividual.nombreCompleto like '%xxx%')

HELP PLZZZZ

select object(cl) from Cliente cl left outer join cl.personaJuridica.representantes rp where cl.personaJuridica.razon social like '%xxx%'

this query works but i still need to compare with rp


Top
 Profile  
 
 Post subject:
PostPosted: Sun Nov 02, 2008 4:43 pm 
Expert
Expert

Joined: Mon Nov 26, 2007 2:29 pm
Posts: 443
Lo que pasa es que, cuando hay datos para uno, no los hay para el otro.
Debes utilizar un "or", (ya que o es una persona o tiene un representante) de la siguiente manera:

Code:
select cl from Cliente cl
left outer join cl.personaJuridica pj
where
(pj.representantes is not null and rp.personaIndividual.nombreCompleto like '%xxx%')

or

(pj.razonSocial is not null and like like '%xxx%')

_________________
Gonzalo Díaz


Top
 Profile  
 
 Post subject:
PostPosted: Tue Nov 04, 2008 4:49 pm 
Newbie

Joined: Fri Oct 31, 2008 10:51 am
Posts: 7
Location: Guatemala
lo pruebo.. pero


Last edited by andreaxd on Tue Nov 04, 2008 4:54 pm, edited 1 time in total.

Top
 Profile  
 
 Post subject: join
PostPosted: Tue Nov 04, 2008 4:50 pm 
Newbie

Joined: Fri Oct 31, 2008 10:51 am
Posts: 7
Location: Guatemala
si gracias, pero, disculpa la pregunta, de donde sakaste el "rp"
y ps ya habia intentado validar que los representantes fueran null o empty, pero aun asi no trae los registros sin representantes, incluso intente crear un query nativo pero nada...


Top
 Profile  
 
 Post subject:
PostPosted: Tue Nov 04, 2008 4:56 pm 
Expert
Expert

Joined: Mon Nov 26, 2007 2:29 pm
Posts: 443
aaah, claro.
Ahora entiendo el problema: ¡estás queriendo hacer un left join a dos "paths" que son "paralelas", al mismo tiempo!

Pégame aquí la definición de las tablas, e internaré ayudarte con una consulta en HQL o Criteria que logre lo que quieres.

_________________
Gonzalo Díaz


Top
 Profile  
 
 Post subject:
PostPosted: Mon Nov 10, 2008 1:52 pm 
Newbie

Joined: Fri Oct 31, 2008 10:51 am
Posts: 7
Location: Guatemala
gonzao_diaz wrote:
aaah, claro.
Ahora entiendo el problema: ¡estás queriendo hacer un left join a dos "paths" que son "paralelas", al mismo tiempo!

Pégame aquí la definición de las tablas, e internaré ayudarte con una consulta en HQL o Criteria que logre lo que quieres.



Agradezco mucho tu ayuda.

Este es el query que construimos con sql el cual nos retorna lo que necesitamos:

SELECT c.* FROM cliente c, persona_juridica pj
where c.id_persona_juridica is not null and c.id_persona_juridica = pj.id
and (pj.nombre_comercial like '%nombre%' or pj.razon_social like '%nombre%'
or pj.id in (SELECT an.id_personaJuridica FROM acta_nombramiento an, persona_individual pi
where an.id_personaIndividual = pi.id
and (concat(pi.primer_nombre, ' ', pi.segundo_nombre, ' ', pi.primer_apellido, ' ',

pi.segundo_apellido, ' ',
pi.apellido_casada) like '%nombre%')));

pero al pasarlo a hql no obtenemos los resultados que queremos.

Las tablas que intervienen son las siguientes:


cliente
id
id_persona_individual
id_persona_juridica

========

persona_juridica
id
nombre_comercial
razon_social
========

persona_individual
id
primer_nombre
segundo_nombre
primer_apellido
segundo_apellido
apellido_casada

===============

acta_nombramiento (tabla de representantes)
id
id_persona_juridica
id_persona_individual


Top
 Profile  
 
 Post subject:
PostPosted: Mon Nov 10, 2008 5:05 pm 
Expert
Expert

Joined: Mon Nov 26, 2007 2:29 pm
Posts: 443
Pasame tambien el archivo de mapeo, por favor.
Nicesito ver qué joins ya hay declarados.

_________________
Gonzalo Díaz


Top
 Profile  
 
 Post subject:
PostPosted: Mon Nov 10, 2008 5:26 pm 
Newbie

Joined: Fri Oct 31, 2008 10:51 am
Posts: 7
Location: Guatemala
Oka... ahi va

cliente

@OneToOne(cascade = {
CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH }
, fetch = FetchType.LAZY)
@JoinColumn(name = "id_persona_individual")
id_persona_individual

@OneToOne(cascade = {
CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH }
, fetch = FetchType.LAZY)
@JoinColumn(name = "id_persona_juridica ")
id_persona_juridica


===============

acta_nombramiento (tabla de representantes)

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_persona_juridica", nullable = false)
id_persona_juridica

@ManyToOne(cascade = {
CascadeType.PERSIST, CascadeType.MERGE }
, fetch = FetchType.LAZY)
@JoinColumn(name = "id_persona_individual", nullable = false)
id_persona_individual


Si bueno mira, solo que no hay archivos de mapeo sino anotaciones en las clases persistentes. Gracias xD


Top
 Profile  
 
 Post subject:
PostPosted: Mon Nov 10, 2008 6:39 pm 
Expert
Expert

Joined: Mon Nov 26, 2007 2:29 pm
Posts: 443
Pues... es bastante confuso.
Aún no me quedan claras unas cuantas cosas.

Pero en fin, asumiendo
    -que tu clase Cliente tenga una propiedad "getPersonaJuridica()"
    -que tu clase ActaDeNombramiento tenga una propiedad "getPersonaIndividual",
    -que tu BD soporta subselects (lo cual es obvio por la consulta SQL)

entonces el SQL que sí anda como quieres, traducido a HQL quedaría

Code:
select cl
from Cliente cl
left outer join cl.personaJuridica pj
where (pj.nombreComercial like '%nombre%' or pj.razonSocial like '%nombre')
or pj in
( select an.personaJuridica puj2
  from ActaNombramiento an
  inner join an.personaIndividual pi
  where
  concat (pi.primer_nombre, ' ', pi.segundo_nombre, ' ', pi.primer_apellido, ' ', pi.segundo_apellido, ' ', pi.apellido_casada) like '%nombre%'
)
[/list]

_________________
Gonzalo Díaz


Top
 Profile  
 
 Post subject:
PostPosted: Mon Nov 10, 2008 6:52 pm 
Newbie

Joined: Fri Oct 31, 2008 10:51 am
Posts: 7
Location: Guatemala
ehhhhh!!!!!!!!!!! muchas gracias x tu tiempo!!!!!!!
que master =D si funciona... jejeje

_________________
hey! i'm 19 ehem... so, please be nice... i'm still learning -.-


Top
 Profile  
 
 Post subject:
PostPosted: Mon Nov 10, 2008 7:49 pm 
Expert
Expert

Joined: Mon Nov 26, 2007 2:29 pm
Posts: 443
Me alegro de que, temporariamente, la cosa se te haya solucionado.

En el futuro, y si tienes control sobre la BD, te recomiendo que agregues varias claves foráneas, y que llames a las columnas con nombres ya calificados (es decir: id_cliente, id_acta_nombramiento, etc).

Lo que estás haciendo con ese subselect, es básicamente un UNION entre condiciones muy distintas de un mismo nivel. (Hibernate aún no soporta UNION).
Puedes también considerar descomponer esa consulta en 2 consultas separadas, lo cual hará tu código más portable e independiente de la marca de BD.

Suerte

_________________
Gonzalo Díaz


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 11 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.