有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何定义标准。不同的根实体实际工作吗?

我目前正在尝试构建一个SQL(纯SQL,直接在数据库上执行-我没有特别使用hibernate)来从数据库中获取数据。这是一个基于Java实现(hibernate)条件查询的导出,我想从其他表中向其中添加其他信息

在Java标准查询中,我有一条语句如下:

Criteria criteria = session.createCriteria(MyEntity.class);
                criteria.createCriteria("fk").add(Restrictions.in("sysid", <<someListofIDsfromPreviousQuery>>))
                criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
                return criteria.list();

从表a(“someListofIDsFromPreviousQuery”)的ID列表中生成1-1结果集,表B(“MyEntity.class”)中有多个结果

I know what DISTINCT_ROOT_ENTITY does但我想知道它实际上是如何工作的,也就是说,一个等价的SQL应该是什么样子

根据上述条件查询的示例:

SELECT COUNT(*) FROM TABLEA a 
WHERE a.property1=someValue AND a.property2=someOtherValue;

返回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;

返回2500个结果

克里特拉怎么样。DISTINCT_ROOT_实体实际上选择了表B的哪个条目作为其“DISTINCT实体”?还是我这里出了什么问题

如果有区别的话:我正在尝试用OracleDB SQL方言编写查询


共 (2) 个答案

  1. # 1 楼答案

    经过一些搜索、实验,通常会感到困惑——似乎DISTINCT_ROOT_实体在如何确定表B中的值方面没有做出任何实际决策。它只是“随机”地从联接中获取结果集的第一个值

    因此,我试图基于SQL的代码实际上是错误的,对它所在的应用程序来说是危险的。很高兴知道<咳嗽

  2. # 2 楼答案

    我发现我们可以通过以下两种不同的方法得到不同的结果

    Projections.distinct(Projections.property("id"));
    

    这是预测,给出的结果与

    criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);