如何添加子选择以进行选择

时间:2016-12-20 16:02:50

标签: java sql hibernate jpa hibernate-mapping

我想执行这样的查询:

void *my_thread(void *arg)
{
    PyGILState_STATE gstate;
    PyObject *result;

    gstate = PyGILState_Ensure();

    if ((result = PyObject_CallFunction(func, NULL))) {
        Py_DECREF(result);
    }
    else {
        PyErr_Print();
    }

    PyGILState_Release(gstate);

    return NULL;
}

我该怎么办? 我通常会为其添加SELECT Table1.COL1, Table1.COL2, (SELECT SUM(Table2.COL3) FROM Table2 WHERE Table2.UID = Table1.UID) SUMOF FROM Table1; 添加Criteria,仅填充ProjectionListCOL1
我创建了一个COL2来计算DetachedCriteria ...

现在,如何将这个独立标准附加到主要标准?我的直觉说 - 这是某种需要添加到列表中的Projection,但我不知道如何。此外,不确定分离标准的sum如何起作用。

另外,我确信这个查询可能以不同的方式编写,例如使用join语句。如果有办法像这样运行它仍然很有趣。

WHERE Table2.COL4 = Table1.COL5和主DetachedCriteria

Criteria

实体(非常短的版本)

DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Table2.class, "table2");
detachedCriteria
  .setProjection(
    Projections.projectionList()
      .add(Projections.sum("table2.col3"), "sumCol3")
  )
  .add(Restrictions.eq("table2.uid", "table1.uid"))
;

Criteria criteria = session.createCriteria(Table1.class, "Table1");
criteria
  .setProjection(
    Projections.projectionList()
      .add(Projections.property("Table1.col1"), "col1")
      .add(Projections.property("Table1.col2"), "col2")
  )
;

1 个答案:

答案 0 :(得分:5)

对于相关子查询(如上所示),您可以使用@Formula,它可以进行任意SQL查询。然后,您需要获取实体并执行子查询。

但是,如果您只需要针对单个业务需求进行此查询,则本机SQL会更加优雅。

对于派生表查询(例如,从select中选择),JPA和Hibernate都不支持派生表查询。

实体查询(JPQL pr Criteria)旨在获取您计划修改的实体。

对于派生表投影,可以使用本机SQL。否则,为什么你认为EntityManager提供了createNativeQuery方法?