Ordenação de um resultset a partir dos valores dos índices

Salve Pessoal,

O assunto não explica bem o que quero, mas o problema eh o seguinte: em uma aplicacao com Struts+Hibernate+PostgreSQL eu tenho as seguintes tabelas:

CREATE TABLE planoensino
(
  idplanoensino serial NOT NULL, -- Identificador do plano de ensino.
  iddisciplinas int4 NOT NULL, -- Identificador da disiplina a qual se refere o plano de ensino.
  iddocentes int4 NOT NULL, -- Identificador do docente que cadastrou o plano de ensino.
  ano varchar(4) NOT NULL, -- Ano ao qual se refere o plano de ensino.
  objetivos text NOT NULL, -- Objetivos da disciplina.
  desctrabalho text NOT NULL, -- Descrição do trabalho a ser realizado.
  criavaliacao text NOT NULL, -- Critério de avaliação.
  topexame1 varchar(255) NOT NULL, -- Tópicos a serem abordados no Exame 1.
  topexame2 varchar(255) NOT NULL, -- Tópicos a serem abordados no Exame 2.
  biblio text NOT NULL, -- Bibliografia da disciplina.
  CONSTRAINT planoensino_pk PRIMARY KEY (idplanoensino),
  CONSTRAINT fk_planoensinoiddisciplina FOREIGN KEY (iddisciplinas)
      REFERENCES disciplinas (iddisciplinas) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk_planoensinoiddoc FOREIGN KEY (iddocentes)
      REFERENCES docentes (iddocentes) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITHOUT OIDS;
ALTER TABLE planoensino OWNER TO postgres;

e

CREATE TABLE disciplinas
(
  iddisciplinas serial NOT NULL, -- Identificador da disciplina.
  iddep int4 NOT NULL, -- Identificador do departamento.
  codigodisciplina varchar(7) NOT NULL, -- Código da disciplina.
  nome varchar(75) NOT NULL, -- Nome da disciplina.
  sigla varchar(7) NOT NULL, -- Sigla pela qual a disciplina é conhecida.
  cargahorariat int2 NOT NULL, -- Carga horária da parte teórica.
  cargahorariap int2, -- Carga horária da parte laboratorial.
  serie int2 NOT NULL, -- Seriação ideal da disciplina.
  semanual int2 NOT NULL, -- 1: Semestre 1 / 2: Semestre 2 / 3: Anual
  CONSTRAINT disciplinas_pk PRIMARY KEY (iddisciplinas),
  CONSTRAINT fk_disciddep FOREIGN KEY (iddep)
      REFERENCES departamentos (iddep) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITHOUT OIDS;

Dentro de um servlet eu recupero uma lista de planos de ensino e gostaria que esta lista estivesse ordenada pelo nome da disciplina. O problema eh que só consigo colocar um order de iddisciplinas…

Alguma sugestão? Obrigado,

celso[/code]

Seria algo como isso?

Olá,

Obrigado, mas eu estou usando Hibernate e gostaria de saber se é possível recuperar os dados sem usar diretamente SQL. Em minha classe DAo eu tenho um método que me retorna a colecao. Eu tentei o seguinte código:

	public Collection getPEs(Docentes docente) throws InfrastructureException {
		Collection pes = null;
		try {
			Session session = HibernateUtil.getSession();
			
			Criteria criteria = session.createCriteria(Planoensino.class);
			criteria.add(Expression.eq("iddocentes", docente));
                        criteria.addOrder( Order.asc("iddisciplinas.nome") );
			pes = criteria.list();
		} catch (HibernateException ex) {
			throw new InfrastructureException(ex);
		}

		return pes;
	}

Mas tenho um erro dizendo que não é possível ordenar por iddisciplinas.nome.

Alguma sugestão?

celso

Da uma olhada no método addOrder do Criteria

http://simoes.org/docs/hibernate-2.1/api/net/sf/hibernate/Criteria.html#addOrder(net.sf.hibernate.expression.Order)

Ahh tá, não tinha lido direito! :oops:

É como o luBS falou aí, é só usar o addOrder().

Qual o nome do atributo que representa a disciplica na classe Planoensino?

ex.:

[code]public class Planoensino{
private Disciplina disciplina;
//continua…
}

criteria.addOrder(Order.asc("disciplina.nome"));[/code]

Salve Pessoal,

Eu ja tinha feito isso (olhem o código da última mensagem enviada). Olhem o erro que eu tenho:

javax.servlet.ServletException: org.hibernate.QueryException: could not resolve property: iddisciplinas.nome of: sw3a.hibernate.Planoensino

O meu pojo plano ensino é:

package sw3a.hibernate;

import java.util.Collection;

public class Planoensino {

	private Integer idplanoensino;
	private Collection topicosplanoensino;
	private Docentes iddocentes;
	private Disciplinas iddisciplinas;
	private String ano;
	private String objetivos;
	private String desctrabalho;
	private String criavaliacao;
	private String topexame1;
	private String topexame2;
	private String biblio;

Este eh o pojo correspondente a tabela Planoensino que eu mandei.

Outras idéias? Estou fazendo na marra criando um novo pojo como o idplanoensino, o nome da disciplina e o ano (as informacoes que me interessam na página JSP), criando uma lista destes pojos e entao ordenando…

celso

E essa classe Disciplinas? Como ela é? E como está o mapeamento?

Sugestão: siga as convenções de codificação: http://java.sun.com/docs/codeconv/

Eu uso o Exadel Pro. É ele que faz as conversões pra mim a partir do BD, gerando o mapeamento e os pojos, por isso eu deixo os nomes como gerados. A tabela disciplina eu já tinha enviado. A pojo disciplina é:

package sw3a.hibernate;

import java.util.Collection;

public class Disciplinas {
	private Integer iddisciplinas;
	private Departamentos iddep;
	private String codigodisciplina;
	private String nome;
	private String sigla;
	private Short cargahorariat;
	private Short cargahorariap;
	private Short serie;
	private Short semanual;
	private Collection planoensino;
	private Collection turmas;

Os mapeamentos são:

Disciplinas.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping schema="public" package="sw3a.hibernate">
  <class name="Disciplinas" table="disciplinas" schema="public" optimistic-lock="none">
    <id name="iddisciplinas" type="integer" unsaved-value="null">
      <column name="iddisciplinas" not-null="true" unique="true" index="disciplinas_pk"/>
      <generator class="native"/>
    </id>
    <property name="codigodisciplina" type="string" column="codigodisciplina" length="7" not-null="true"/>
    <property name="nome" type="string" column="nome" length="75" not-null="true"/>
    <property name="sigla" type="string" column="sigla" length="7" not-null="true"/>
    <property name="cargahorariat" type="short" column="cargahorariat" not-null="true"/>
    <property name="cargahorariap" type="short" column="cargahorariap"/>
    <property name="serie" type="short" column="serie" not-null="true"/>
    <property name="semanual" type="short" column="semanual" not-null="true"/>
    <many-to-one name="iddep" entity-name="sw3a.hibernate.Departamentos" cascade="none" foreign-key="fk_disciddep" column="iddep"/>
    <bag name="planoensino" inverse="true" cascade="none">
      <key foreign-key="fk_planoensinoiddisciplina" not-null="true" column="iddisciplinas"/>
      <one-to-many entity-name="sw3a.hibernate.Planoensino"/>
    </bag>
    <bag name="turmas" inverse="true" cascade="none">
      <key foreign-key="fk_turiddisc" not-null="true" column="iddisciplinas"/>
      <one-to-many entity-name="sw3a.hibernate.Turmas"/>
    </bag>
  </class>
</hibernate-mapping>

Planoensino.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping schema="public" package="sw3a.hibernate">
  <class name="Planoensino" table="planoensino" schema="public" optimistic-lock="none">
    <id name="idplanoensino" type="integer" unsaved-value="null">
      <column name="idplanoensino" not-null="true" unique="true" index="planoensino_pk"/>
      <generator class="native"/>
    </id>
    <property name="ano" type="string" column="ano" length="4" not-null="true"/>
    <property name="objetivos" type="string" column="objetivos" not-null="true"/>
    <property name="desctrabalho" type="string" column="desctrabalho" not-null="true"/>
    <property name="criavaliacao" type="string" column="criavaliacao" not-null="true"/>
    <property name="topexame1" type="string" column="topexame1" length="255" not-null="true"/>
    <property name="topexame2" type="string" column="topexame2" length="255" not-null="true"/>
    <property name="biblio" type="string" column="biblio" not-null="true"/>
    <many-to-one name="iddocentes" entity-name="sw3a.hibernate.Docentes" cascade="none" foreign-key="fk_planoensinoiddoc" column="iddocentes"/>
    <many-to-one name="iddisciplinas" entity-name="sw3a.hibernate.Disciplinas" cascade="none" foreign-key="fk_planoensinoiddisciplina" column="iddisciplinas"/>
    <bag name="topicosplanoensino" inverse="true" cascade="none">
      <key foreign-key="fk_topplensinoidplensino" not-null="true" column="idplanoensino"/>
      <one-to-many entity-name="sw3a.hibernate.Topicosplanoensino"/>
    </bag>
  </class>
</hibernate-mapping>

Obrigado pela ajuda![/b]