【问题标题】:How to return only ceratin columns in a hibernate query?如何在休眠查询中仅返回某些列?
【发布时间】:2015-03-27 12:34:16
【问题描述】:

我想在我的hibernate 查询中从多个表中返回某些选定的列。我可以这样做,但它返回一个我似乎无能为力的 Object 类型。

这是我的查询

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,其中包含nameidstatusgetterssetters 以及constuctor 字段。我还需要做什么才能使Hibernate 在此TaskInstanceLineItem 对象中返回此查询,而不仅仅是作为一个对象?

【问题讨论】:

    标签: java mysql sql hibernate


    【解决方案1】:

    您可以从 HQL 创建 TaskInstanceLineItem 的实例。您必须使用类的字段创建构造函数。

    "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"
    

    【讨论】:

    • 知道我现在可以如何构建 DISTINCT 部分吗?
    【解决方案2】:

    你可以在你的类上有一个构造函数来接收你想要检索的字段作为参数:

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

    然后你像这样创建查询:

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

    【讨论】:

    • 感谢工作完美,知道我现在如何在 DISTINCT 部分构建吗?
    【解决方案3】:

    试试这个:

    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);
    

    【讨论】:

      猜你喜欢
      • 2014-02-24
      • 2016-09-20
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多