Problemas com Restrictions.in

Pessoas,

Tenho as seguintes classes:

public classe PedidoExame{
 
@Id
	@Column(name = "id_pedido_exame", length = 10)
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer idPedidoExame;

@ManyToMany(cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH }, fetch = FetchType.LAZY)
        @JoinColumn(name = "id_pedido_exame")
	private List<Exame> exames;

@Column(name = "data_entrada")
	@Temporal(TemporalType.TIMESTAMP)
	private Date dataEntrada;

   .
   .(Outros atributos da classe)
   .
}
public class Exame{

        @Id
	@Column(name = "id_exame", length = 10)
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer idExame;

        .
        .(Outros atributos da classe)
        .
}

A idéia é fazer um select de todos os PedidoExame, num período de data selecionada pelo usuário, que contém uma lista de exames selecionados também pelo usuário.

Método de busca implementado:

public List<PedidoExame> findPedidoExameByPeriodoAndExames(Date dataInicial, Date dataFinal, List<Exame> exames)
			throws PersistenceBusinessException {
		Calendar cal = Calendar.getInstance();
		cal.setTime(dataInicial);

		cal.set(Calendar.AM_PM, Calendar.AM);
		cal.set(Calendar.HOUR, 00);
		cal.set(Calendar.MINUTE, 00);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);

		dataInicial = cal.getTime();

		cal.setTime(dataFinal);

		cal.set(Calendar.AM_PM, Calendar.AM);
		cal.set(Calendar.HOUR, 23);
		cal.set(Calendar.MINUTE, 59);
		cal.set(Calendar.SECOND, 59);
		cal.set(Calendar.MILLISECOND, 99);

		dataFinal = cal.getTime();

		Criterion cData = Restrictions.between("dataEntrada", dataInicial, dataFinal);
		Criterion cExames = Restrictions.in("exames", exames);

		return this.findByCriteria(PedidoExame.class, new Criterion[] { cData, cExames });
	}

Executando o método, dá o seguinte erro, q está ocorrendo exatamento por causa do Restrictions.in:

br.com.pesagro.business.exception.PersistenceBusinessException: could not execute query
	at br.com.pesagro.gui.exame.JRExamesRealizadoPorPeriodoImpl.<init>(JRExamesRealizadoPorPeriodoImpl.java:53)
	at br.com.pesagro.gui.administracao.RelatorioPedidoDeExamePorPeriodoForm.btGerarClicked(RelatorioPedidoDeExamePorPeriodoForm.java:229)
	at br.com.pesagro.gui.administracao.RelatorioPedidoDeExamePorPeriodoForm.access$0(RelatorioPedidoDeExamePorPeriodoForm.java:227)
	at br.com.pesagro.gui.administracao.RelatorioPedidoDeExamePorPeriodoForm$1.actionPerformed(RelatorioPedidoDeExamePorPeriodoForm.java:162)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
	at java.awt.Component.processMouseEvent(Component.java:6263)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
	at java.awt.Component.processEvent(Component.java:6028)
	at java.awt.Container.processEvent(Container.java:2041)
	at java.awt.Component.dispatchEventImpl(Component.java:4630)
	at java.awt.Container.dispatchEventImpl(Container.java:2099)
	at java.awt.Component.dispatchEvent(Component.java:4460)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
	at java.awt.Container.dispatchEventImpl(Container.java:2085)
	at java.awt.Window.dispatchEventImpl(Window.java:2478)
	at java.awt.Component.dispatchEvent(Component.java:4460)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Gostaria de ajuda para fazer funcionar o Restrictions.in…com os Criterions… ou de qualquer outra forma…

Obrigado!

Fernando

Fernando,

tente passar um Array para o IN ao invés de um List.

Eu sempre utilizo Arrays e não tenho problemas.

Abraço.

[quote=altitdb]Fernando,

tente passar um Array para o IN ao invés de um List.

Eu sempre utilizo Arrays e não tenho problemas.

Abraço.[/quote]

Troquei:

Criterion cExames = Restrictions.in("exames", exames);

por

Criterion cExames = Restrictions.in("exames", exames.toArray());

continua o mesmo problema…

Pode postar o método findByCriteria?

Segue:

protected List findByCriteria(Class objectClass, Criterion[] restrictions) throws PersistenceBusinessException {
		Session session = hibernateUtil.getSession();
		try {
			Criteria criteria = session.createCriteria(objectClass);
			for (Criterion criterion : restrictions) {
				criteria.add(criterion);
			}
			return criteria.list();
		} catch (Exception e) {
			throw new PersistenceBusinessException(e.getMessage());
		}
	}

Se você retirar o IN funciona??

Sim, funciona…Esse é um método genérico e bastante utilizado. Sempre funcionou normalmente…O que está dando erro mesmo é o Restrictions.in

No meu caso aqui, fiz esses dias dessa forma:

crit.add(Restrictions.in(“tipoProduto”, new Integer[]{1, 3}));

E funciona normalmente.

Outra coisa, você quer procurar os Pedidos de Exame que contenham alguns Exames certo?

Se você utilizar o OU ao invés de IN ??

[quote=altitdb]No meu caso aqui, fiz esses dias dessa forma:

crit.add(Restrictions.in(“tipoProduto”, new Integer[]{1, 3}));

E funciona normalmente.

Outra coisa, você quer procurar os Pedidos de Exame que contenham alguns Exames certo?

Se você utilizar o OU ao invés de IN ??

[/quote]

O teu tipoProduto é um Objeto??

Eu quero por exemplo…

Tenho 3 Objetos de PedidoExame, com sua lista de respectivos Exames:

PedidoExame 1
Exame 1
Exame 2
Exame 3

PedidoExame 2
Exame 2

PedidoExame 3
Exame 1
Exame 3

Eu quero por exemplos todos os PedidoExame que contenham o Exame 2…
o PedidoExame 1 e PedidoExame 2…

No meu Criterion, peguei como objeto de busca, um List de Exames…e esperava que com o Restrictions.in, ele verificasse nesse List, se cotenha algum dos exames que passei no Restrictions…me retornando os pedidos que contenham algum desses exames…

Não sei se fui claro.

Fernando

Tenho a impressão que o erro esteja no fato de eu estar fazendo um Restrictions.in em um List de objetos…Talvez funcionaria fazer apenas em um Objeto…

Pelo que está parecendo é isso mesmo.

Tenta fazer a consulta através da outra classe então.

[quote=altitdb]Pelo que está parecendo é isso mesmo.

Tenta fazer a consulta através da outra classe então.

[/quote]

Mas a idéia é trazer os PedidoExame que contém esses exames passado para pesquisa…Será q não tem alguma forma de fazer essa pesquisa?

Fernando

Fernando,

se você fizer a consulta na outra classe vai conseguir trazer também os valores da PedidoExame.

[quote=altitdb]Fernando,

se você fizer a consulta na outra classe vai conseguir trazer também os valores da PedidoExame.

[/quote]

Entendi…fazer 2 consultas…Em exames, buscando os ids de PedidoExame que contém os Exames passados como parâmetro, depois por PedidoExame pelos ids encontrados…

É…um trabalho a mais, mas se for o único jeito…

Vlw!! Obrigado pela ajuda!

Fernando