Pessoal tenho a seguinte estrutura de entidades
Albuns e Foto … A entidade Albuns tem um List de Foto veja … e quero faze um select aonde me retorne Todos Albuns aonde o atributo publicado da
Foto é igual a ‘SIM’
Veja o meu select como está
public List<Album> buscarAlbunsDoCliente(Integer idCliente) throws Exception {
em = getEntityManager();
List<Album> albuns = new ArrayList<Album>();
try {
Query consultaCliente = em.createQuery("SELECT p FROM Pessoa p WHERE p.id = :id ");
consultaCliente.setParameter("id", idCliente);
Pessoa pessoa = (Pessoa) consultaCliente.getSingleResult();
if (pessoa.getPerfil().equals(Perfil.ADMINISTRADOR)) {
Query consulta = em.createQuery("SELECT a FROM Album a WHERE a.fotos.publicado = 'SIM' ");
albuns = consulta.getResultList();
} else {
Query consulta = em.createQuery("SELECT a FROM Album a WHERE a.cliente.id = :id AND a.fotos.publicado = 'SIM'");
consulta.setParameter("id", idCliente);
albuns = consulta.getResultList();
}
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
em.close();
return albuns;
}
porem gera a seguinte execeção
java.lang.IllegalArgumentException: org.hibernate.QueryException: illegal attempt to dereference collection [album0_.id.fotos] with element property reference [publicado] [SELECT a FROM entidades.Album a WHERE a.fotos.publicado = 'SIM' ]
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1201)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147)
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:275)
at persistencias.AlbumDAO.buscarAlbunsDoCliente(AlbumDAO.java:31)
at negocios.AlbumBO.buscarAlbunsDoCliente(AlbumBO.java:53)
at apresentacao.AlbumVisualizacaoMB.buscarAlbunsDoCliente(AlbumVisualizacaoMB.java:137)
at apresentacao.AlbumVisualizacaoMB.<init>(AlbumVisualizacaoMB.java:51)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:188)
at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:102)
at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:405)
at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:267)
at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:86)
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72)
at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:69)
at org.apache.el.parser.AstValue.getValue(AstValue.java:112)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:102)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:178)
at javax.faces.component.UIOutput.getValue(UIOutput.java:168)
at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:338)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:164)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:295)
at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848)
at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:58)
at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:46)
at org.primefaces.component.panel.PanelRenderer.encodeContent(PanelRenderer.java:225)
at org.primefaces.component.panel.PanelRenderer.encodeMarkup(PanelRenderer.java:148)
at org.primefaces.component.panel.PanelRenderer.encodeEnd(PanelRenderer.java:75)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1620)
at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1613)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:380)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:662)
Caused by: org.hibernate.QueryException: illegal attempt to dereference collection [album0_.id.fotos] with element property reference [publicado] [SELECT a FROM entidades.Album a WHERE a.fotos.publicado = 'SIM' ]
at org.hibernate.hql.ast.tree.DotNode$1.buildIllegalCollectionDereferenceException(DotNode.java:68)
etc..
Aqui esta a estrutura de entidades, só uma OBSERVAÇÃO o atributo publicado é um ENUM que contem SIM ou NAO no banco
Foto
@Entity
@Table(name = "Foto")
public class Foto implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Integer id;
@Column(name = "nome", nullable = true)
private String nome;
@Lob
private byte[] foto;
@Column(name = "publicado", nullable = false)
private Publicado publicado;
@Column(name = "selecionada", nullable = false)
private Boolean selecionada;
@Transient
private String selecionadaAuxiliar;
@Temporal(javax.persistence.TemporalType.DATE)
@Column(name = "dataPublicacao", nullable = true)
private Date dataPublicada;
@Transient
private StreamedContent streamedContent;
//Construtor
public Foto() {
this.setPublicado(Publicado.NAO);
this.setSelecionada(Boolean.FALSE);
}
//get set
}
Album
@Entity
@Table(name = "Album")
public class Album implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Integer id;
@OneToOne(cascade=CascadeType.DETACH)
private Pessoa cliente;
@OneToMany(cascade=CascadeType.ALL , fetch=FetchType.EAGER)
@JoinColumn(name="fotos", referencedColumnName="id")
@Column(name = "fotos", nullable = false)
private List<Foto> fotos;
@Column(name = "descricao", nullable = true)
private String descricao;
//Construtor
public Album(){
this.setCliente(new Pessoa());
this.setFotos(new ArrayList<Foto>());
}
//Get e Set
}
Deste já agradeço
