Duvida select max com jpa

30/12/2009

1

Ola pessoal, tenho uma relaçao entre 2 tabelas. Especies e Racas. Sendo que a tabela Racas é de chaves composta, e por este motivo criei uma terceira classe apenas com as chaves. Minha duvida é que preciso trazer o ultimo id de racas aonde o codigo da especie for = PARAMETRO..

Como seria isto?

Eu tentei assim mas nao funciona.Alguem poderia me dar uma luz?

view plaincopy to clipboardprint?    //Encontrar ultimo código da Racas por CódEspecie      public Integer getLastIdByIdEspecies(Integer idEspecies) {            Object id = pesq("Select MAX(ra.idRacas) FROM  RacasPK ra WHERE ra.idEspecies  = " + idEspecies).getSingleResult();          int idtoReturn = 1;            if (id != null) {              idtoReturn = ((Integer) id) + 1;          } else {          }            return idtoReturn;      }  }   //Encontrar ultimo código da Racas por CódEspecie public Integer getLastIdByIdEspecies(Integer idEspecies) { Object id = pesq("Select MAX(ra.idRacas) FROM RacasPK ra WHERE ra.idEspecies = " + idEspecies).getSingleResult(); int idtoReturn = 1; if (id != null) { idtoReturn = ((Integer) id) + 1; } else { } return idtoReturn; } }

view plaincopy to clipboardprint?public class Especies implements Serializable {      private static final long serialVersionUID = 1L;      @Id      @GeneratedValue(strategy = GenerationType.IDENTITY)      @Basic(optional = false)      @Column(name = "idEspecies")      private Integer idEspecies;      @Basic(optional = false)      @Column(name = "Descricao")      private String descricao;      @OneToMany(cascade = CascadeType.ALL, mappedBy = "especies")      private Collection<Racas> racasCollection;        public Especies() {      }  public class Especies implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "idEspecies") private Integer idEspecies; @Basic(optional = false) @Column(name = "Descricao") private String descricao; @OneToMany(cascade = CascadeType.ALL, mappedBy = "especies") private Collection<Racas> racasCollection; public Especies() { }

view plaincopy to clipboardprint?public class Racas implements Serializable {      private static final long serialVersionUID = 1L;      @EmbeddedId      protected RacasPK racasPK;      @Basic(optional = false)      @Column(name = "Descricao")      private String descricao;      @OneToMany(cascade = CascadeType.ALL, mappedBy = "racas")      private Collection<Animais> animaisCollection;      @JoinColumn(name = "idEspecies", referencedColumnName = "idEspecies", insertable = false, updatable = false)      @ManyToOne(optional = false)      private Especies especies;        public Racas() {      }  public class Racas implements Serializable { private static final long serialVersionUID = 1L; @EmbeddedId protected RacasPK racasPK; @Basic(optional = false) @Column(name = "Descricao") private String descricao; @OneToMany(cascade = CascadeType.ALL, mappedBy = "racas") private Collection<Animais> animaisCollection; @JoinColumn(name = "idEspecies", referencedColumnName = "idEspecies", insertable = false, updatable = false) @ManyToOne(optional = false) private Especies especies; public Racas() { }

view plaincopy to clipboardprint?@Embeddable  public class RacasPK implements Serializable {      @Basic(optional = false)      @Column(name = "idRacas")      private int idRacas;      @Basic(optional = false)      @Column(name = "idEspecies")      private int idEspecies;        public RacasPK() {      }        public RacasPK(int idRacas, int idEspecies) {          this.idRacas = idRacas;          this.idEspecies = idEspecies;      } 
Responder

Posts

Tive que fazer uma aplicação em que em uma determinada situação era necessário buscar o último objeto persistido, fiz a seguinte consulta: RigDna rigDna = dao.pesqParam("Select a From RigDna a Where a.id = (Select max(b.id) From RigDna b)");
Responder
Andrei, precisei recentemente de algo parecido: Tinha uma tabela de itens de pedido e um tabela de unidades e cada item de pedido, possuia mais de uma unidade. Então fiz um laço for para percorrer todos os itens e dentro de cada item armazenei uma coleção de unidades. Assim:   Na sua classe Raça, crie uma variável do tipo @Transient, ou seja, para indicar que não será persistido no banco e encapsule:   public class Raca implements Serializable{ ...   @Transient private String raca   public String getRaca(){ return raca; }   public void setRaca(Srring raca) this.raca = raca; ...   }   Na sequencia, na sua classe controladora de espécies, implemente o laço for, dentro do método que captura o list de espécies trazendo o todos os objetos da classe Raca e jogando-o numa coleção. Feito isso, calcule o tamanho do array, subtraia 1 e você terá o último objeto da classe Raca para o objeto Especie em questão:   public List<Especie> getEspecies(boolean all){ EntityManager em = getEntityManager(); try { Query q = em.createQuery("SELECT object(i) FROM Raca i"); if(!all){ q.setMaxResults(batchSize); q.setFirstResult(getFirstItem()); ) int indice; List<Especie> qryEspecie = q.getResultList(); //este objeto armaz. o resultado da query List<Especie> minhasEspecies = new ArrayList<Especie>(); //este objeto armaz. todos os objetos Espécie   for(Especie e : qryEspecie) { indice = e.getRacaIdCollection().size(); Object [] o; o = e.getRacaIdCollection().toArray(); //transforma a coleção de raças da especie em questão num array Raca r;   if(o.length != 0) { r = (Raca) o[o.length - 1]; if(!em.isOpen()) { em = super.getEntityManager(); } e.setRaca(r.getRaca()); } ...   Alguma coisa assim... espero ter ajudado!            
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira