Criteria.DISTINCT_ROOT_ENTITY 是如何运作的?
How does Criteria.DISTINCT_ROOT_ENTITY actually work?
我目前正在尝试构建一个 SQL(普通 SQL,直接在数据库上执行 - 我没有为此特别使用休眠)以从我的数据库中获取数据。它是基于 Java 实现的(休眠)条件查询的导出,我想向其中添加来自其他表的其他信息。
在Java条件查询中,我有如下语句:
Criteria criteria = session.createCriteria(MyEntity.class);
criteria.createCriteria("fk").add(Restrictions.in("sysid", <<someListofIDsfromPreviousQuery>>))
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
return criteria.list();
从 Table A ("someListofIDsFromPreviousQuery") 的 ID 列表中得到 1-1 结果集,Table B ("MyEntity.class").
I know what DISTINCT_ROOT_ENTITY does 但我想知道它 实际上是如何工作的 ,也就是说,等效的 SQL 会是什么样子?
根据上面的条件查询的例子:
SELECT COUNT(*) FROM TABLEA a
WHERE a.property1=someValue AND a.property2=someOtherValue;
Returns 2000 个结果。 (这是我的 ID 列表)
SELECT COUNT(*) FROM TABLEA a
JOIN TABLEB b ON b.fk = a.sysid -- <-- this is basically equivalent to what the criteria query above does, no?
WHERE a.property1=someValue AND a.property2=someOtherValue;
Returns 2500 个结果。
Critera.DISTINCT_ROOT_ENTITY实际上是如何选择 TABLEB 的哪个条目作为其“独立实体”的?还是我这里有问题?
如果它有所作为:我正在尝试在 OracleDB SQL 方言中编写我的查询。
我发现我们可以使用以下两种不同的方式得到不同的结果
Projections.distinct(Projections.property("id"));
这是给出与
相同结果的投影
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
经过一些搜索、试验并普遍感到困惑 - 似乎 DISTINCT_ROOT_ENTITY 没有就如何确定 Table B 的值做出任何实际决策。它只需要第一个“随机”加入的结果集的值。
所以我试图作为我的 SQL 基础的代码实际上是错误的,并且对于它所在的应用程序来说是危险的。很高兴知道。 咳嗽
我目前正在尝试构建一个 SQL(普通 SQL,直接在数据库上执行 - 我没有为此特别使用休眠)以从我的数据库中获取数据。它是基于 Java 实现的(休眠)条件查询的导出,我想向其中添加来自其他表的其他信息。
在Java条件查询中,我有如下语句:
Criteria criteria = session.createCriteria(MyEntity.class);
criteria.createCriteria("fk").add(Restrictions.in("sysid", <<someListofIDsfromPreviousQuery>>))
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
return criteria.list();
从 Table A ("someListofIDsFromPreviousQuery") 的 ID 列表中得到 1-1 结果集,Table B ("MyEntity.class").
I know what DISTINCT_ROOT_ENTITY does 但我想知道它 实际上是如何工作的 ,也就是说,等效的 SQL 会是什么样子?
根据上面的条件查询的例子:
SELECT COUNT(*) FROM TABLEA a
WHERE a.property1=someValue AND a.property2=someOtherValue;
Returns 2000 个结果。 (这是我的 ID 列表)
SELECT COUNT(*) FROM TABLEA a
JOIN TABLEB b ON b.fk = a.sysid -- <-- this is basically equivalent to what the criteria query above does, no?
WHERE a.property1=someValue AND a.property2=someOtherValue;
Returns 2500 个结果。
Critera.DISTINCT_ROOT_ENTITY实际上是如何选择 TABLEB 的哪个条目作为其“独立实体”的?还是我这里有问题?
如果它有所作为:我正在尝试在 OracleDB SQL 方言中编写我的查询。
我发现我们可以使用以下两种不同的方式得到不同的结果
Projections.distinct(Projections.property("id"));
这是给出与
相同结果的投影criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
经过一些搜索、试验并普遍感到困惑 - 似乎 DISTINCT_ROOT_ENTITY 没有就如何确定 Table B 的值做出任何实际决策。它只需要第一个“随机”加入的结果集的值。
所以我试图作为我的 SQL 基础的代码实际上是错误的,并且对于它所在的应用程序来说是危险的。很高兴知道。 咳嗽