Dúvida sobre criteria Hibernate

Pessoal tenho as seguintes classes:

@Entity
@Table(name = "TESTE_PH2")
public class TestePh implements Serializable {

    private static final long serialVersionUID = 1L;
    
    @GeneratedValue
    @Column(name = "COD_BEN")
    @Id
    private String codBen;
    
    @Column(name = "MES_FINAL")
    @Temporal(TemporalType.DATE)     
    private Date mesFinal = null;

    public TestePh() {
    }

    public TestePh(String codBen) {
        this.codBen = codBen;
    }

    public String getCodBen() {
        return codBen;
    }

    public void setCodBen(String codBen) {
        this.codBen = codBen;
    }

    public Date getMesFinal() {
        return mesFinal;        
    }

    public void setMesFinal(Date mesFinal) {
        this.mesFinal = mesFinal;
    }

    @Override
    public String toString() {
        return "model.TestePh[ mesFinal=" + mesFinal + " ]";
    }

E…

public void buscar() {
        obTestePh = new TestePh();        
        List<TestePh> listaBoleto = null;         
        listaBoleto = TestePhDAO.buscarPoCod(form.getCodBen());
        if (obTestePh != null) {                                    
            form.setCodBen(obTestePh.getCodBen());
            form.zeraLinhasTblBoletos();
            for (int x = 0; x <= listaBoleto.size() - 1; x++) {
                form.adicionaTblBoletos(listaBoleto);
            }
        } else {
            obTestePh = null;
            JOptionPane.showMessageDialog(null, "Dados de teste não encontrado ... ", "Procurando Dados...", JOptionPane.PLAIN_MESSAGE);
        }
    }

E…

public static List<TestePh> buscarPoCod(String codBen) {
        session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Criteria listaBoleto =  session.createCriteria(TestePh.class);                   
        if (codBen != null)            
            listaBoleto.add(Restrictions.eq("codBen", codBen));                                                      
                             
        return listaBoleto.list();        
        
    }

O problema é que na minha tabela no banco (oracle) tenho o seguinte registros: 3379000, 01/05/2011
3379000, 23/10/2014
3379000, 15/02/2015

O “listaBoleto.list()” está retornando as três linhas, porém com o primeiro registro 3379000, 01/05/2011.
E não estou conseguindo retornar os três registros que de fato há no banco. Usando criteria há alguma solução?

Ative a propriedade hibernate.show_sql e verifique qual o sql que ele está criando e executando. Isso te permitirá verificar se a lógica empregada é a mais adequada.
Outra coisa, como você está pegando esta lista, no momento em que está acessando a mesma?

O sql gerado pelo hibernate

select
        this_.COD_BEN as COD_BEN1_2_0_,
        this_.MES_FINAL as MES_FINA2_2_0_ 
    from
        TESTE_PH2 this_ 
    where
        this_.COD_BEN=?

Executando esse mesmo sql no banco passando o código 3379000 na clausura where me retorna exatamente os três registro com as datas distintas.

No meu JFrame estou utilizando uma JTable para mostrar os dados na tela.

public void adicionaTblBoletos(List<TestePh> boletos) {
        TestePhTableModel etm = (TestePhTableModel)tblBoleto.getModel();
        tblBoleto.getColumnModel().getColumn(0).setPreferredWidth(100);
        tblBoleto.getColumnModel().getColumn(1).setPreferredWidth(100);        
        etm.limpar();        
        etm.addListaDeEstados(boletos); 
    }

mas onde você pega esses boletos? Eles vem direto do dao?

Luis_Augusto_Santos, me desculpe a ignorância mas não compreendi sua pergunta.

Tentarei responder…
No meu entendimento boletos são o listaBoletos.list() do DAO.

Quando eu adiciono esta linha no método na minha classe DAO: listaBoletos.setFirstResult(2);
É apresentado na jtable exatamente o último registro. Não entendi muito bem o funcionamento deste setFirstResult();

public static List<TestePh> buscarPoCod(String codBen) {
        session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Criteria listaBoleto =  session.createCriteria(TestePh.class);                   
        if (codBen != null)            
            listaBoleto.add(Restrictions.eq("codBen", codBen));
            listaBoletos.setFirstResult(2);                                          
        return listaBoleto.list();        
    }

Bom eu gostaria de conseguir entender e fazer a jtable listar os registros corretamente. Mas se hover uma forma de sempre retornar o último registro já resolveria o problema.

OBS: tentei utilizar também o setMaxResults(), mas também retorna o primeiro registro nas demais linhas.

Então estuda. Pega a documentação do hibernate e lê.
Se não fizer isso, vai precisar seguir o caminho mais difícil, que é o das tentativas e erros.