Search code examples
javaoracle-databasehibernatecriteria

How to do criteria queries for oracle


How to remake this code to work with oracle. Before that, it worked with Postgres and there were no errors. Now it gives sql grammatical error.

 public List<MyOrder> myOrderListNew(Company company){
        Criteria criteria = session.getCurrentSession().createCriteria(MyOrder.class);
        criteria.add(Restrictions.eq("company.id", company.getId()));
        criteria.add(Restrictions.eq("removeorder", false));
        criteria.add(Restrictions.eq("status", "new"));
        criteria.addOrder(Order.desc("id"));
        List<MyOrder> myOrders = criteria.list();
        return myOrders;
    }

about the : criteria.add (Restrictions.eq ("company.id", company.getId ()));

"company.id", here company this property in the entity class MyOrder.

StackTrace

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1013)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

org.hibernate.exception.SQLGrammarException: could not extract ResultSet
    org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63)
    org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)
    org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)
    org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:69)




java.sql.SQLSyntaxErrorException: ORA-01747: invalid user.table.column, table.column, or column specification

    oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:494)
    oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446)
    oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054)
    oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623)
    oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252)



Error : 1747, Position : 144, Sql = select this_.myOrder_id as myOrder_id1_6_0_, this_.myorder_company_id as myorder_company_id9_6_0_, this_.courier_id as courier_id10_6_0_, this_.date as date2_6_0_, this_.date_hms as date_hms3_6_0_, this_.hide as hide4_6_0_, this_.removeorder as removeorder5_6_0_, this_.selected as selected6_6_0_, this_.shops_id as shops_id11_6_0_, this_.status as status7_6_0_, this_.sum as sum8_6_0_ from myorder this_ where this_.myorder_company_id=:1  and this_.removeorder=:2  and this_.status=:3  order by this_.myOrder_id desc, OriginalSql = select this_.myOrder_id as myOrder_id1_6_0_, this_.myorder_company_id as myorder_company_id9_6_0_, this_.courier_id as courier_id10_6_0_, this_.date as date2_6_0_, this_.date_hms as date_hms3_6_0_, this_.hide as hide4_6_0_, this_.removeorder as removeorder5_6_0_, this_.selected as selected6_6_0_, this_.shops_id as shops_id11_6_0_, this_.status as status7_6_0_, this_.sum as sum8_6_0_ from myorder this_ where this_.myorder_company_id=? and this_.removeorder=? and this_.status=? order by this_.myOrder_id desc, Error Msg = ORA-01747: invalid user.table.column, table.column, or column specification

    oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:498)
    oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446)
    oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054)
    oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623)
    oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252)
    oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612)

Solution

  • Formatted, query you use is this. I've marked what seems to be wrong: column names can't be DATE nor SUM as these are reserved words (for a datatype and a function).

      SELECT this_.myOrder_id AS myOrder_id1_6_0_,
             this_.myorder_company_id AS myorder_company_id9_6_0_,
             this_.courier_id AS courier_id10_6_0_,
             this_.date AS date2_6_0_,                               --> this
             this_.date_hms AS date_hms3_6_0_,
             this_.hide AS hide4_6_0_,
             this_.removeorder AS removeorder5_6_0_,
             this_.selected AS selected6_6_0_,
             this_.shops_id AS shops_id11_6_0_,
             this_.status AS status7_6_0_,
             this_.SUM AS sum8_6_0_                                  --> this
        FROM myorder this_
       WHERE     this_.myorder_company_id = :1
             AND this_.removeorder = :2
             AND this_.status = :3
    ORDER BY this_.myOrder_id DESC
    

    What to do? Depends on table description. If you managed to create such a table, then you must have enclosed column names into double quotes. If that's so, you'll have to do the same every time you work with those columns, e.g.

    SQL> create table myorder
      2    ("DATE"   date,
      3     "SUM"    number
      4    );
    
    Table created.
    
    SQL> -- this is what you are currently doing; see? The same ORA-01747 error
    SQL> select this_.date,
      2         this_.sum
      3  from myorder this_;
    select this_.date,
                 *
    ERROR at line 1:
    ORA-01747: invalid user.table.column, table.column, or column specification
    
    SQL> -- this is what you should be doing
    SQL> select this_."DATE",
      2         this_."SUM"
      3  from myorder this_;
    
    no rows selected
    
    SQL>
    

    If possible, change column names to make your life easier.