2015-03-27 1 views
1

Я хочу вернуть определенные выбранные столбцы из нескольких таблиц в мой запрос hibernate. Я могу это сделать, но он возвращается как тип объекта, с которым я, похоже, ничего не могу с этим поделать.Как вернуть только столбцы ceratin в запросе на спящий режим?

Это мой запрос

public static synchronized List<TaskInstanceLineItem> getOpenTasks() { 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    Transaction transaction = null; 
    List<TaskInstanceLineItem> list = null; 

    try { 
     transaction = session.beginTransaction(); 
     Query query = session.createQuery("SELECT DISTINCT ti.taskComponents.task.name, ti.Id, ti.status FROM TaskInstance ti" 
       + " INNER JOIN ti.taskComponents.task WHERE ti.taskComponents.live=true"); 
     list = query.list(); 
     transaction.commit(); 

    } catch (HibernateException e) { 
     transaction.rollback(); 
     e.printStackTrace(); 
    } finally { 
     session.close(); 
    } 

    return list; 
} 

И я создал класс TaskInstanceLineItem, который имеет поля name, id и status, getters и setters и constuctor. Что еще нужно сделать, чтобы Hibernate вернул этот запрос внутри этого объекта TaskInstanceLineItem, а не только как объект?

ответ

1

Вы можете создать экземпляры TaskInstanceLineItem из HQL. Вы должны создать конструктор, используя поля класса.

"SELECT DISTINCT new TaskInstanceLineItem(ti.taskComponents.task.name, ti.Id, ti.status) FROM TaskInstance ti" 
      + " INNER JOIN ti.taskComponents.task WHERE ti.taskComponents.live=true" 
+0

Спасибо, работал отлично. – OneTwo

+0

Любая идея, как я могу теперь построить часть DISTINCT? – OneTwo

0

Попробуйте это:

String SQL = ".."; //same SQL as you had before 
Query query = getEntityManager().createNativeQuery(SQL); //no entity mapping 
query.setParameter("idContact", 9293L); 
Object string = query.getSingleResult(); 
System.out.println(string); 
1

Вы можете иметь конструктор на классе, который принимает поля, которые вы хотите получить в качестве параметров:

public class TaskInstance { 
    public TaskInstance(Integer field1, String field2) { 
     this.field1 = field1; this.field2 = field2; 
    } 
} 

Затем создайте запрос, как это :

select new TaskInstance(field1, field2) from TaskInstance inner join...... 
+0

Спасибо, отлично работает. Любая идея, как я могу теперь построить часть DISTINCT? – OneTwo

Смежные вопросы