【问题标题】:Criteria, need select only root fields条件,只需要选择根字段
【发布时间】:2014-05-26 10:36:24
【问题描述】:

我对 Hibernate 标准有疑问。我需要通过一些动态条件以及 Empoyee 字段(LAZY 字段)上的条件获取公司列表。我创建了这样的标准:

Criteria criteria = session.createCriteria(Company.class);

criteria.createAlias("employee", "employee");
criteria.add(Restrictions.eq("employee.someFieldForWhere", "text"));

criteria.list();

对于 Employee 字段的添加条件,我必须添加别名(在我的情况下,我添加了具有相同名称“员工”的别名)。

但在这种情况下,我得到不正确且非法的 SQL 查询 - 在这种情况下,Hibernate 尝试从别名中选择所有字段:

    select
        this_.id as id1_0_1_,
        this_.employee_id as employee2_0_1_,
        employee1_.id as id1_1_0_,
        employee1_.someBigField as someBigF2_1_0_,
        employee1_.someFieldForWhere as someFiel3_1_0_ 
    from
        Company this_ 
    inner join
        Employee employee1_ 
            on this_.employee_id=employee1_.id 
    where
        employee1_.someFieldForWhere=?

这是不可接受的,因为表 Employee 包含许多文件,我不需要在我的请求中加载它(在我的示例中它加载 id、 someFieldForWhere 和 someBigField )。

那么问题 - 如何在没有子实体的选择字段的情况下创建具有子实体条件的标准?

我需要这样的东西:

        select
            this_.id as id1_0_1_,
            this_.employee_id as employee2_0_1_,
        from
            Company this_ 
        inner join
            Employee employee1_ 
                on this_.employee_id=employee1_.id 
        where
            employee1_.someFieldForWhere=?

玩的项目,有完整的来源 - https://github.com/Akvel/criteriaTest

【问题讨论】:

    标签: java hibernate hibernate-criteria


    【解决方案1】:

    您可以通过根据您的标准设置预测来指定要选择的字段

        Criteria criteria = session.createCriteria(Company.class);
    
        criteria.createAlias("employee", "employee");
        criteria.add(Restrictions.eq("employee.someFieldForWhere", "text"));
    
        ProjectionList projections = Projections.projectionList();
        // just the root id
        projections.add(Projections.id());
        // the associated entity id
        projections.add(Projections.property("employee.id");
    
        criteria.setProjections(projections);
    
        criteria.list();
    

    Hibernate docs

    【讨论】:

    • 已经尝试过这种方式,在这种情况下,每当字段发生变化时,我都需要将根实体的所有渴望字段添加到投影中。在这种情况下,问题是您不能设置为投影根实体或某个别名。
    猜你喜欢
    • 2016-12-26
    • 2013-10-23
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    相关资源
    最近更新 更多