Search code examples
javamysqlhibernatecriteria

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


all I am doing MySql query with using hibernate criteria in Java. 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. but when I copy and paste MySql query from console to MySql editor I am getting same results everytime. Of course in mySql editor must give same results. but not getting why hibernate criteria is giving me results in different order everytime?

Thanks in advance. Every answer will be appreciate.


Solution

  •     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...