Desculpe se o tópico é duplicado, mas dei uma pesquisada e não encontrei algo que resolvesse o meu problema.
Meu problema: tenho duas entidades (Pessoa e Endereço), e o relacionamento entre elas é de 1 para muitos, ou seja, 1 pessoa pode ter muitos endereços.
O mapeamento da classe Pessoa fica da seguinte forma:
@Table
@Entity
public class Pessoa{
@OneToMany(mappedBy = "idPessoa", fetch = FetchType.LAZY)
@Cascade({ CascadeType.REFRESH, CascadeType.SAVE_UPDATE, CascadeType.DELETE_ORPHAN })
private Set<Endereco> enderecoList = new HashSet<Endereco>(0);
//getters e setters
}
É o próprio hibernate que realiza a busca dos enderecos, mas eu a ordenação dos registros na lista não fica da forma como eu queria (que deveria ser sempre ordenado pelo id do endereço).
Aí eu preciso ficar sempre usando Collections.sort pra ordenar a lista em todo lugar q eu usá-la. Já tentei colocar o Collections.sort dentro do getEnderecoList da classe Pessoa pra reduzir o número pra 1 a utilização da ordenação, mas isso também não funcionou.
Enfim, alguém sabe de alguma maneira pra forçar o hibernate a trazer o enderecoList ordenado de acordo com algum atributo?
boa tarde
Faz o seguinte:
@OrderBy(value=“name_column”)
ficará assim:
@Table
@Entity
public class Pessoa{
@OneToMany(mappedBy = "idPessoa", fetch = FetchType.LAZY)
@Cascade({ CascadeType.REFRESH, CascadeType.SAVE_UPDATE, CascadeType.DELETE_ORPHAN })
@OrderBy(value="name_column")
private Set<Endereco> enderecoList = new HashSet<Endereco>(0);
//getters e setters
}
Até mais.
Vlw velho! isso mesmo que eu queria.
Obrigado!
Eu tenho esse mesmo caso e, já tentei de tudo que é forma utilizar a notação @OrderBy, tanto do javax, quanto do Hibernate. Só que na hora de subir a aplicação da o erro abaixo.
Cheguei a resolver o problema de ordenar colocando no get da collection um sort. Mas não queria ter que fazer desta forma. Quero usar a anotação mesmo. E vi em varios lugares, a principio não tem segredo, é só por e dizer por qual coluna quer ordenar.
11:50:23,309 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC00001: Failed to start service jboss.persistenceunit."SceWebEar.ear/SceWeb.war#pu": org.jboss.msc.service.StartException in service jboss.persistenceunit."SceWebEar.ear/SceWeb.war#pu": Failed to start service
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1767) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [rt.jar:1.7.0]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [rt.jar:1.7.0]
at java.lang.Thread.run(Unknown Source) [rt.jar:1.7.0]
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: pu] Unable to build EntityManagerFactory
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:914)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:889)
at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:73)
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.createContainerEntityManagerFactory(PersistenceUnitServiceImpl.java:162)
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.start(PersistenceUnitServiceImpl.java:85)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
... 3 more
Caused by: org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.collection.OneToManyPersister
at org.hibernate.persister.internal.PersisterFactoryImpl.create(PersisterFactoryImpl.java:248)
at org.hibernate.persister.internal.PersisterFactoryImpl.createCollectionPersister(PersisterFactoryImpl.java:196)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:375)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1737)
at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:84)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904)
... 9 more
Caused by: org.hibernate.HibernateException: Unable to parse order-by fragment
at org.hibernate.sql.ordering.antlr.OrderByFragmentTranslator.render(OrderByFragmentTranslator.java:66)
at org.hibernate.sql.Template.renderOrderByStringTemplate(Template.java:696)
at org.hibernate.persister.collection.AbstractCollectionPersister.<init>(AbstractCollectionPersister.java:558)
at org.hibernate.persister.collection.OneToManyPersister.<init>(OneToManyPersister.java:85)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) [rt.jar:1.7.0]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) [rt.jar:1.7.0]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) [rt.jar:1.7.0]
at java.lang.reflect.Constructor.newInstance(Unknown Source) [rt.jar:1.7.0]
at org.hibernate.persister.internal.PersisterFactoryImpl.create(PersisterFactoryImpl.java:226)
... 14 more
Caused by: java.lang.ClassCastException: antlr.CommonToken cannot be cast to antlr.Token
at antlr.CharScanner.makeToken(CharScanner.java:173)
at org.hibernate.sql.ordering.antlr.GeneratedOrderByLexer.mIDENT(GeneratedOrderByLexer.java:238)
at org.hibernate.sql.ordering.antlr.GeneratedOrderByLexer.nextToken(GeneratedOrderByLexer.java:138)
at antlr.TokenBuffer.fill(TokenBuffer.java:69)
at antlr.TokenBuffer.LA(TokenBuffer.java:80)
at antlr.LLkParser.LA(LLkParser.java:52)
at org.hibernate.sql.ordering.antlr.GeneratedOrderByFragmentParser.expression(GeneratedOrderByFragmentParser.java:504)
at org.hibernate.sql.ordering.antlr.GeneratedOrderByFragmentParser.sortKey(GeneratedOrderByFragmentParser.java:325)
at org.hibernate.sql.ordering.antlr.GeneratedOrderByFragmentParser.sortSpecification(GeneratedOrderByFragmentParser.java:241)
at org.hibernate.sql.ordering.antlr.GeneratedOrderByFragmentParser.orderByFragment(GeneratedOrderByFragmentParser.java:190)
at org.hibernate.sql.ordering.antlr.OrderByFragmentTranslator.render(OrderByFragmentTranslator.java:60)
... 22 more
Segue o bean.
@OneToMany(mappedBy = "empresa", targetEntity = EmpresaTipoAjuste.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval=true)
@org.hibernate.annotations.OrderBy(clause="codigo ASC")
private Set<EmpresaTipoAjuste> empresasTiposAjustes = new LinkedHashSet<EmpresaTipoAjuste>();
tentei assim também, utilizando javax.
@OneToMany(mappedBy = "empresa", targetEntity = EmpresaTipoAjuste.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval=true)
@OrderBy("codigo ASC")
private Set<EmpresaTipoAjuste> empresasTiposAjustes = new LinkedHashSet<EmpresaTipoAjuste>();
Alguém sabe o que pode estar acontecendo?
Só pra constar. O problema foi resolvido modificando a versão do antlr de 2.7.6 para 3.0.
Obrigado de qualquer forma.