Consulta quando 1 campo de base de dados esta com null [RESOLVIDO]

17 respostas
P

boa tarde pessoal,
estou utilizando java, hibernate com configuração xml, base de dados postgresql.

estou com a seguinte duvida, como faço para fazer uma consulta cujo algum campo em base de dados seja null, pelo que percebi quando existe em base de dados algum campo com valor null a minha consulta retorna erro.

se precisam de mais informação não hesitem, estou as ordens. uma parte do erro

13:25:38,017 ERROR [jsp:?] java.lang.NullPointerException java.lang.NullPointerException at com.test.deletePOS.serveResource(deleteClient.java:49) at com.liferay.portlet.FilterChainImpl.doFilter(FilterChainImpl.java:119) at com.liferay.portal.kernel.portlet.PortletFilterUtil.doFilter(PortletFilterUtil.java:71) at com.liferay.portal.kernel.servlet.PortletServlet.service(PortletServlet.java:92) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302) at com.liferay.portlet.InvokerPortletImpl.invoke(InvokerPortletImpl.java:635) at com.liferay.portlet.InvokerPortletImpl.invokeResource(InvokerPortletImpl.java:747) at com.liferay.portlet.InvokerPortletImpl.serveResource(InvokerPortletImpl.java:504) at com.liferay.portal.action.LayoutAction.processPortletRequest(LayoutAction.java:871) at com.liferay.portal.action.LayoutAction.processLayout(LayoutAction.java:613) at com.liferay.portal.action.LayoutAction.execute(LayoutAction.java:232) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)

17 Respostas

D

Usando hql?
Se for, em SQL padrão (ANSI) temos o IS NULL.
Não lembro se Criteria possui algo assim.

J

Você pode a Condição para retirar os resultados NULL de sua tabela:

Vai trazer os resultados que o campo especificado não seja NULL.

H

Basta chamar os métodos que verificam o null, para HQL is null e isNull no criteria! =D
Como você está fazendo sua consulta?

P

obrigado a todos que responderam. aqui esta o meu método que faz a consulta

public ArrayList<ViewClient> getViewClient(int clientId){
		
		SessionFactory sessionFactory = new Configuration().configure("/hibernatem2.cfg.xml").buildSessionFactory();
		Session session = sessionFactory.openSession();
		
		ArrayList<ViewClient> listViewClient = new ArrayList<ViewClient>(); 
		
		try {
			Query q = session.createQuery("From ViewClient where zone_id = "+clientId);
			listViewClient = (ArrayList<ViewClient>) q.list();			
			
		} catch (Exception e) {
			e.printStackTrace();			
		} finally {
			session.close();
			sessionFactory.close();			
		}		
		
		return listViewClient;		
	}

}

pessoal não é uma tabela mais sim uma vista,
suponhamos que o meu vista (view) tem 3 colunas (nome, morada, idade), numa linha temos idade null mais está outros dados, e eu quero recuperar esta linha.
exemplo quero carregar esta informação para ficar
nome: carlos
morada: vila baixo
idade:

do que eu entendi das respostas tem um problema. (entendi que devo colocar por exemplo idade diferente de null)
se eu fizer alguma condição para idade diferente de null não vou ter esta linha. e não é isso que eu quero.
fico aguardando ....

D
praia:
obrigado a todos que responderam. aqui esta o meu método que faz a consulta
public ArrayList<ViewClient> getViewClient(int clientId){
		
		SessionFactory sessionFactory = new Configuration().configure("/hibernatem2.cfg.xml").buildSessionFactory();
		Session session = sessionFactory.openSession();
		
		ArrayList<ViewClient> listViewClient = new ArrayList<ViewClient>(); 
		
		try {
			Query q = session.createQuery("From ViewClient where zone_id = "+clientId);
			listViewClient = (ArrayList<ViewClient>) q.list();			
			
		} catch (Exception e) {
			e.printStackTrace();			
		} finally {
			session.close();
			sessionFactory.close();			
		}		
		
		return listViewClient;		
	}

}

pessoal não é uma tabela mais sim uma vista,
suponhamos que o meu vista (view) tem 3 colunas (nome, morada, idade), numa linha temos idade null mais está outros dados, e eu quero recuperar esta linha.
exemplo quero carregar esta informação para ficar
nome: carlos
morada: vila baixo
idade:

do que eu entendi das respostas tem um problema. (entendi que devo colocar por exemplo idade diferente de null)
se eu fizer alguma condição para idade diferente de null não vou ter esta linha. e não é isso que eu quero.
fico aguardando ....


Não!
Desconsidere a resposta do IS NOT NULL, ela está errada.

Se você quer buscar idade, nome e morada e a condição é que idade ESTEJA com valor NULL a consulta deve ser
if(clienteId != null){
Query q = session.createQuery("From ViewClient where zone_id = "+clientId + " AND idade IS NULL");
Repito, para a tua necessidade, a resposta do IS NOT NULL está fora de cogitação
J

Usa então o iterator para recuperar seus resultados.

try {
			Session session = factory.openSession();
			query = session.createQuery(From ViewClient where zone_id = "+clientId);

			Iterator iterator = query.list().iterator();
			while (iterator.hasNext()) {
				object = (Object) iterator.next();
				collection.add(object);
			}
			
		} catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			session.close();
		}
P

drsmachado desculpe mais não entendi o que você disse.

o seu query não creio que vai resolver o meu problema, porque voce esta dizendo para ele apanhar tudo onde idade é igual a null.

estou certo ou errado???

J
drsmachado:
praia:
obrigado a todos que responderam. aqui esta o meu método que faz a consulta
public ArrayList<ViewClient> getViewClient(int clientId){
		
		SessionFactory sessionFactory = new Configuration().configure("/hibernatem2.cfg.xml").buildSessionFactory();
		Session session = sessionFactory.openSession();
		
		ArrayList<ViewClient> listViewClient = new ArrayList<ViewClient>(); 
		
		try {
			Query q = session.createQuery("From ViewClient where zone_id = "+clientId);
			listViewClient = (ArrayList<ViewClient>) q.list();			
			
		} catch (Exception e) {
			e.printStackTrace();			
		} finally {
			session.close();
			sessionFactory.close();			
		}		
		
		return listViewClient;		
	}

}

pessoal não é uma tabela mais sim uma vista,
suponhamos que o meu vista (view) tem 3 colunas (nome, morada, idade), numa linha temos idade null mais está outros dados, e eu quero recuperar esta linha.
exemplo quero carregar esta informação para ficar
nome: carlos
morada: vila baixo
idade:

do que eu entendi das respostas tem um problema. (entendi que devo colocar por exemplo idade diferente de null)
se eu fizer alguma condição para idade diferente de null não vou ter esta linha. e não é isso que eu quero.
fico aguardando ....


Não!
Desconsidere a resposta do IS NOT NULL, ela está errada.

Se você quer buscar idade, nome e morada e a condição é que idade ESTEJA com valor NULL a consulta deve ser
if(clienteId != null){
Query q = session.createQuery("From ViewClient where zone_id = "+clientId + " AND idade IS NULL");
Repito, para a tua necessidade, a resposta do IS NOT NULL está fora de cogitação

Pelo o que entendi ele queria eliminar resultados NULL, mas não tinha especificado que era colunas especificas da sua view.

D

Isso

me faz entender que ele quer buscar algo no banco cuja coluna específica contenha valor nulo.

J

drsmachado:
Isso

me faz entender que ele quer buscar algo no banco cuja coluna específica contenha valor nulo.

Se ele recuperar os resultados de sua query usando Iterator como falei logo acima ele não terá problema java.lang.NullPointerException,
pois este erro acontece porque tenta já popular direto no objeto, com isso o Hibernate não consegui fazer os parse tendo objeto NULL.

P

pessoal desculpem se eu não expressei bem o que eu quero, pelas varias explicação pensei que tinha sido claro mais outra vez desculpem.

mais é o seguinte o que eu quero é que na minha consulta a coluna que esta com NULL não viesse,
dei vários exemplos, será necessário dar outro exemplo?
-sim vou dar.

exemplificando mais uma fez:
VINHA vista (view)

NOME | MORADA | IDADE
joao vilaBaixo 15
pedro vilaCima
carlos vilaMeio 17

ao chamar o metodo de pesquiza e colocar num arrayList exemplo listCliet

se eu fizer:
listCliet.getId().get(1).getId().getIdade()); - vou ter o erro que mencionei la no inicio.

espero que com este exeemplo consegui exprimir melhor.
no aguardo …

será que ninguém ja passou por isso?

J

praia:
pessoal desculpem se eu não expressei bem o que eu quero, pelas varias explicação pensei que tinha sido claro mais outra vez desculpem.

mais é o seguinte o que eu quero é que na minha consulta a coluna que esta com NULL não viesse,
dei vários exemplos, será necessário dar outro exemplo?
-sim vou dar.

exemplificando mais uma fez:
VINHA vista (view)

NOME | MORADA | IDADE
joao vilaBaixo 15
pedro vilaCima
carlos vilaMeio 17

ao chamar o metodo de pesquiza e colocar num arrayList exemplo listCliet

se eu fizer:
listCliet.getId().get(1).getId().getIdade()); - vou ter o erro que mencionei la no inicio.

espero que com este exeemplo consegui exprimir melhor.
no aguardo …

será que ninguém ja passou por isso?

Posta o mapeamento desta classe.

P

jtiagoarruda aqui esta o mapeamento.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Jul 16, 2012 5:25:43 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.common.ViewPosEPoshistoryEFlexpos" table="view_pos_e_poshistory_e_flexpos">
        <composite-id name="id" class="com.common.ViewPosEPoshistoryEFlexposId">
            <key-property name="misisdn" type="java.lang.Integer">
                <column name="misisdn" />
            </key-property>
            <key-property name="posId" type="java.lang.Integer">
                <column name="pos_id" />
            </key-property>
            <key-property name="owner" type="string">
                <column name="owner" length="50" />
            </key-property>
            <key-property name="address" type="string">
                <column name="address" length="50" />
            </key-property>
            <key-property name="name" type="string">
                <column name="name" length="25" />
            </key-property>
            <key-property name="ownerContact" type="java.lang.Integer">
                <column name="owner_contact" />
            </key-property>
            <key-property name="email" type="string">
                <column name="email" length="30" />
            </key-property>
            <key-property name="posColor" type="string">
                <column name="pos_color" length="15" />
            </key-property>
            <key-property name="active" type="java.lang.Boolean">
                <column name="active" />
            </key-property>
            <key-property name="zoneId" type="java.lang.Integer">
                <column name="zone_id" />
            </key-property>
        </composite-id>
    </class>
</hibernate-mapping>
D

praia:
drsmachado desculpe mais não entendi o que você disse.

o seu query não creio que vai resolver o meu problema, porque voce esta dizendo para ele apanhar tudo onde idade é igual a null.

estou certo ou errado???


Creio que o maior problema seja a forma com a qual você está descrevendo o problema.
Se você conseguisse expor em palavras, seria bem mais fácil.

Pela última explicação, entendi que você quer buscar o valor de cada coluna, desde que, este valor não seja nulo.
Caso este seja nulo, você quer ignorar esta coluna e trazer as demais, certo?

Se é isso, então você tem um problema bem grande e provavelmente, precise fazer muita gambiarra.

O que eu sugiro é que você trate o resultado e, se o mesmo estiver null, você define um valor padrão para cada atributo do objeto.
Muito mais fácil.

J

Só uma pergunta tu já leu a Documentação do Hibernate a respeito de Restrictions ?
Caso não e bem recomendado que faça isso… esse problema seu pode ser resolvido com Restrictions.

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html
http://www.mkyong.com/hibernate/hibernate-criteria-examples/

Criteria crt = session.createCriteria(ViewClient.class);
crt.add( Restrictions.eq( "zone_id", clientId));  
crt.add( Restrictions.isNotNull( "name"));
P

Pela última explicação, entendi que você quer buscar o valor de cada coluna, desde que, este valor não seja nulo.
Caso este seja nulo, você quer ignorar esta coluna e trazer as demais, certo?

exactamente é isso que eu quero.

rsrsrsrsrsrsrsrsr

O que eu sugiro é que você trate o resultado e, se o mesmo estiver null, você define um valor padrão para cada atributo do objeto.
Muito mais fácil.

isso resolveria o meu problema mais como fazer?

se eu fizer:
listCliet.getId().get(1).getId().getIdade()); - vou ter o erro que mencionei la no inicio.

como driblar o problema?

2 - estou pensando resolver o problema lá no view (dizer que quando a coluna é null para coolocar 0 eu qualquer coisa)

P

resolvido pessoal e obrigado a todos que mostraram disponibilidade em ajudar.
mais acabei por resolver sozinho.

como tinha dita que estava a pensar resolver o problema la no meu view, resolvi seguir este metodo.
como se tratava de um view fui em base de dados e coloquei para quando estar NULL que colocasse 0.

adicionando apenas este codigo.
Case WHEN tb_pos.owner_contact IS NULL THEN 0 else tb_pos.owner_contact end as owner_contact ,

obrigado a todos e que continuamos dessa forma para que a comunidade possa crescer ainda mais.

Criado 23 de julho de 2012
Ultima resposta 24 de jul. de 2012
Respostas 17
Participantes 5