简体   繁体   English

为什么冬眠标准不保持criteria.list()结果的顺序?

[英]Why hibernate Criteria not maintaining order in results of criteria.list()?

all I am doing MySql query with using hibernate criteria in Java. 我正在使用Java中的休眠条件来做MySql查询。 I am giving small snap-shot of my code below. 我在下面提供我的代码的小快照。

        Criteria criteria = getCurrentSession().createCriteria(A.class, "a");
        ProjectionList projections = Projections.projectionList();

        projections.add(Projections.distinct(Projections.property("a.column_of_a")));
        projections.add(Projections.property("b.column_of_b"));
        projections.add(Projections.property("c.column_of_c"));
        criteria.setProjection(projections);

        criteria.createAlias("a.listName1", "b", JoinType.LEFT_OUTER_JOIN);
        criteria.createAlias("b.listName2", "c", JoinType.LEFT_OUTER_JOIN);
        criteria.createAlias("c.listName3", "d", JoinType.LEFT_OUTER_JOIN);

        criteria.add(Restrictions.eq("a.column_of_a", someValue));
        criteria.add(Restrictions.eq("c.column_of_c", someValue));

        criteria.addOrder(Order.asc("a.column_of_a"));
        criteria.addOrder(Order.desc("b.column_of_b"));

        @SuppressWarnings("unchecked")
        List<Object[]> records = criteria.list();

        for(int i=0;i<3;i++)
        {
            Object record[] = records.get(i);
            Object value = record[1];
            System.out.println("value::"+value);
        }

now my problem is that when I am getting results in Java code and I am printing in eclipse Console I am getting results in different order every time I execute code. 现在的问题是,当我在Java代码中获取结果并在eclipse Console中进行打印时,每次执行代码时,我都以不同的顺序获取结果。 but when I copy and paste MySql query from console to MySql editor I am getting same results everytime. 但是,当我从控制台将MySql查询复制并粘贴到MySql编辑器时,每次都会得到相同的结果。 Of course in mySql editor must give same results. 当然在mySql编辑器中必须给出相同的结果。 but not getting why hibernate criteria is giving me results in different order everytime? 但不知道为什么冬眠标准每次都会给我不同顺序的结果?

Thanks in advance. 提前致谢。 Every answer will be appreciate. 每个答案将不胜感激。

    Criteria criteria = getCurrentSession().createCriteria(A.class, "a");


    criteria.createAlias("a.listName1", "b", JoinType.LEFT_OUTER_JOIN);
    criteria.createAlias("b.listName2", "c", JoinType.LEFT_OUTER_JOIN);
    criteria.createAlias("c.listName3", "d", JoinType.LEFT_OUTER_JOIN);

    ProjectionList projections = Projections.projectionList();

    projections.add(Projections.distinct(Projections.property("a.column_of_a")));
    projections.add(Projections.property("b.column_of_b"));
    projections.add(Projections.property("c.column_of_c"));
    criteria.setProjection(projections);

    criteria.add(Restrictions.eq("a.column_of_a", someValue));
    criteria.add(Restrictions.eq("c.column_of_c", someValue));

    criteria.addOrder(Order.asc("a.column_of_a"));
    criteria.addOrder(Order.desc("b.column_of_b"));

    @SuppressWarnings("unchecked")
    List<Object[]> records = criteria.list();

    for(int i=0;i<3;i++)
    {
        Object record[] = records.get(i);
        Object value = record[1];
        System.out.println("value::"+value);
    }

I think you code is projecting property before creating alias. 我认为您的代码在创建别名之前是投影属性。 try above code... 尝试上面的代码...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM