Duvida com clausula where no HQL

6 respostas
ricardo.narezi

Boa tarde amigos.

tenho o seguinte model

@Entity
@Table(name="SERVICO")
public class ServicoModel implements  BaseModel<ServicoVo>{

	private static final long serialVersionUID = -8126373234303136212L;

	ServicoModel() {
		super();
	}

	@Id
	@TableGenerator(name="ID_SERVICO_PK", pkColumnName="NM_SEQUENCE", pkColumnValue="SERVICO", valueColumnName="NR_CURRENT_KEY", table="SEQUENCE_BLOCK", allocationSize=0, initialValue=1 )
	@GeneratedValue( strategy = GenerationType.TABLE, generator = "ID_SERVICO_PK" )
	@Column(name="ID_SERVICO_PK", nullable=false)
	private Integer id;
	
	@Fetch(FetchMode.SUBSELECT)
	@ManyToMany(fetch = FetchType.EAGER,cascade=CascadeType.REFRESH)
	@JoinTable(name = "REMUNERACAO_CONTABIL_SERVICO", 
	joinColumns = {@JoinColumn(name = "ID_SERVICO_PK")},
	inverseJoinColumns = {@JoinColumn(name = "ID_TP_REMUNERACAO_CONTABIL_FK")})
	private List<TipoRemuneracaoModel> remuneracoes;
	
	@Column(name="CD_SERVICO")
	private Long cdServico;

	@Column(name="DT_INCLUSAO")
	private Date dtInclusao;
	
	@Column(name="NO_USUARIO_INCLUSAO", columnDefinition="VARCHAR(50)")
	private String nmUsuarioInclusao;
	
	@Column(name="DT_ALTERACAO")
	private Date dtAlteracao;
	
	@Column(name="NO_USUARIO_ALTERACAO", columnDefinition="VARCHAR(50)")
	private String nmUsuarioAlteracao;
	
	@ManyToOne
	@JoinColumn(name = "ID_TIPO_LANCAMENTO_FK")
	@Fetch(FetchMode.JOIN)	
	private TipoLancamentoModel tipoLancamento;

Preciso colocar alguns parametros na clausula where para o campo remuneracoes e como ele é um List eu não sei como fazer isso...

preciso de algo como

where remuneracoes in (valores)... porém ele é uma lista...

obrigado pela ajuda

6 Respostas

AGAraujo

Boa tarde!!!

Não entendi bem seu problema, mas se for utilizar um filtro com “IN” a forma é normal, parecido com SQL.

Pode usar assim “[…] where myObject.FIELD in (:MyValuesCollections)”

Isto não tem nada haver com você associar-se com uma lista, pois a ideia do HQL é similar ao SQL ou melhor OQL.

Se não for isto passe mais informações e o erro que está ocorrendo.

t+

marcos1EM

o AGAraujo está certo, parece que é o mesmo caso de um outro post
http://www.guj.com.br/posts/list/82539.java

marcos1EM

o AGAraujo está certo, parece que é o mesmo caso de um outro post
http://www.guj.com.br/posts/list/82539.java

Ops!! enviei duas vezes a mesma resposta :smiley:

ricardo.narezi

o problema é nesse relacionamento

@Fetch(FetchMode.SUBSELECT) @ManyToMany(fetch = FetchType.EAGER,cascade=CascadeType.REFRESH) @JoinTable(name = "REMUNERACAO_CONTABIL_SERVICO", joinColumns = {@JoinColumn(name = "ID_SERVICO_PK")}, inverseJoinColumns = {@JoinColumn(name = "ID_TP_REMUNERACAO_CONTABIL_FK")}) private List<TipoRemuneracaoModel> remuneracoes;

preciso colocar uma clausula no where relativa a esse relacionamento

tipo

where remuneracoes in…

só que é uma lista List<TipoRemuneracaoModel> remuneracoes

como faço para colocar um where nessa campo remuneracoes

obrigado

marcos1EM

Veja o meu caso, não é igual mas acho que ajuda.

// Na  classe GFaxArquivos tenho esse atributo que também é uma lista:
     @OneToMany(mappedBy="codFaxArquivo",fetch=FetchType.EAGER,cascade=CascadeType.ALL)
      private List<GFaxVariaveis> variaveis;

  //Posso fazer a seguinte consulta
    return getSession().createQuery("select  fax from GFaxArquivos fax " +
                " left join fax.variaveis as vars "
                +" where vars in (:lista) ").
                setParameterList("lista",listaVariaveises).list();
AGAraujo

Bom dia!!

// Na  classe GFaxArquivos tenho esse atributo que também é uma lista:  
OneToMany(mappedBy="codFaxArquivo",fetch=FetchType.EAGER,cascade=CascadeType.ALL)  
private List<GFaxVariaveis> variaveis;

Não há a necessidade de definir fetch=FetchType.EAGER. Isto se não for bem usado pode, inclusive ser um problema.

//Posso fazer a seguinte consulta  
  return getSession().createQuery("select  fax from GFaxArquivos fax " +  
              " left join fax.variaveis as vars "  
              +" where vars in (:lista) ").  
              setParameterList("lista",listaVariaveises).list();

Existe outra maneira utilizando o comando “elements”, porém a definida pelo marcos está muito prática.

Analisando um pouco a instrução: quando mandamos recuperar um “GFaxArquivos” sem nenhum join é como se tivessemos buscando utilizando o fetch=LAZY, ou seja os elementos da lista “variaveis” não virão juntos. Serão recuperados de acordo com a necessidade.

Para que venham juntos é necessário utilizar o “join”, tornando assim a consulta com se fosse fetch=EAGER. Pois bem, então é possível imaginar esta consulta de outra forma ou utilizando o subconsultas ou o comando “elements()” do HQL.

Ai vai da imaginação e da necessidade.

t+

Criado 18 de novembro de 2010
Ultima resposta 19 de nov. de 2010
Respostas 6
Participantes 3