[RESOLVIDO]Buscar apenas campo especifico com Criteria

Olá a todos.

Não entendo muito the Hibernate nem de Criteria.

Tenho uma classe que faz um filtro baseado nas informações passadas pelo usuário, que retorna uma lista completa de um determinado Objeto. Eu gostaria de retornar apenas uma lista de IDs dos objetos filtrados.

Por exemplo:

Criteria criteria = getSession().createCriteria(GuiaGSBTO.class);
//critria.add(Restrictions...
return criteria.list();

Eu gostaria de retornar uma lista contendo apenas os IDs dos objetos filtrados (lista de inteiros).

É possível fazer isso por Criteria ou vou ter que refazer tudo com hql?

Valeu!

Creio que isto te ajude…
http://www.java2s.com/Tutorial/Java/0350__Hibernate/SelectSpecificFieldsinaEntitywithCriteriaandProjections.htm

Poxa vida, tenho certeza que ajudaria, mas não consigo acessar sites que não o GUJ aqui da empresa :frowning:

Mas muito obrigado, vou dar uma olhada mais tarde.

Poderia por favor me dar um exemplo de uso?

import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;

public class Main {
  public static void main(String[] args) throws Exception {
    HibernateUtil hibernateUtil = new HibernateUtil();
    hibernateUtil
        .executeSQLCommand("create table survey (id int,name varchar, purchasedate date);");

    Session session = hibernateUtil.getSession();

    Survey survey = new Survey();
    survey.setName("Survey");
    survey.setPurchaseDate(new Date());

    session.save(survey);

    
    survey = new Survey();
    survey.setName("Survey1");
    survey.setPurchaseDate(new Date());    
    session.save(survey);
    
    session.flush();
    
    Criteria crit = session.createCriteria(Survey.class);
    ProjectionList projList = Projections.projectionList();
    projList.add(Projections.property("Id"));
    projList.add(Projections.property("name"));
    crit.setProjection(projList);
    
    
    List results = crit.list();
    System.out.println(results);
    
    session.close();
    hibernateUtil.checkData("select * from survey");
  }
}
import java.util.Date;

public class Survey {
  private int id;

  private String name;

  private Date purchaseDate;

  public Date getPurchaseDate() {
    return purchaseDate;
  }

  public void setPurchaseDate(Date purchaseDate) {
    this.purchaseDate = purchaseDate;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }
}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
  Session session;
  Statement st;
  public HibernateUtil() throws Exception{
    SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
    session = sessionFactory.openSession();

    // Load the JDBC driver.
    Class.forName("org.hsqldb.jdbcDriver");
    System.out.println("Driver Loaded.");
    // Establish the connection to the database.
    String url = "jdbc:hsqldb:data/tutorial";

    Connection conn = DriverManager.getConnection(url, "sa", "");
    System.out.println("Got Connection.");
    st = conn.createStatement();
  }
  public Session getSession(){
    return session;
  }
  public void executeSQLCommand(String sql) throws Exception {
    st.executeUpdate(sql);
  }

  public void checkData(String sql) throws Exception {
    ResultSet rs = st.executeQuery(sql);
    ResultSetMetaData metadata = rs.getMetaData();

    for (int i = 0; i < metadata.getColumnCount(); i++) {
      System.out.print("\t"+ metadata.getColumnLabel(i + 1)); 
    }
    System.out.println("\n----------------------------------");

    while (rs.next()) {
      for (int i = 0; i < metadata.getColumnCount(); i++) {
        Object value = rs.getObject(i + 1);
        if (value == null) {
          System.out.print("\t       ");
        } else {
          System.out.print("\t"+value.toString().trim());
        }
      }
      System.out.println("");
    }
  }
}
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
        <property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
        <property name="connection.url">jdbc:hsqldb:data/tutorial</property>
        <property name="connection.username">sa</property>
        <property name="connection.password"></property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.HSQLDialect</property>
        <!-- Enable Hibernate's current session context -->
        <property name="current_session_context_class">org.hibernate.context.ManagedSessionContext</property>

        <property name="hibernate.cache.use_second_level_cache">false</property>
        <property name="hibernate.cache.use_query_cache">false</property>
        
        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>        
        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
        
        <!-- Mapping files -->
        <mapping resource="Survey.hbm.xml"/>
    </session-factory>
</hibernate-configuration>
projList.add(Projections.property("Id"));   

Valeu!