2

以下はカスタム SQL です。

SELECT COUNT(*) 
FROM EEC_Order 
WHERE DATE(EEC_Order.createDate) = CURDATE() 
    AND EEC_Order.status = ? 
    AND EEC_Order.companyId = ?

上記のSQLクエリはmysqlで機能しますが、カスタムSQLログインは機能しません

public class OrderFinderImpl extends BasePersistenceImpl<Order> implements OrderFinder    {
    public int getTodayOrderCount(String status,long companyId) {
        Session session = null;
        SQLQuery query = null;
        try {

            String sql = CustomSQLUtil.get(GET_TODAY_ORDER_COUNT);          
            session = openSession();            
            query = session.createSQLQuery(sql);            
            query.addEntity("Order", OrderImpl.class);          
            QueryPos qPos = QueryPos.getInstance(query);            
            qPos.add(status);
            qPos.add(companyId);            
            Iterator<Long> itr = query.list().iterator();
                if (itr.hasNext()) {
                Long count = itr.next();
                    if (count != null) {                
                     return count.intValue();               
                    }
                }                       
            }               
            catch (Exception e) {               
                e.printStackTrace();
            }               
            finally {               
            closeSession(session);              
            }
        return 0;           
    }
    public static String GET_TODAY_ORDER_COUNT = "getTodayOrderCount";

}

コンソールの例外:

04:56:56,520 ERROR [http-bio-8080-exec-6][JDBCExceptionReporter:76] Column 'orderId' not found.
com.liferay.portal.kernel.dao.orm.ORMException: org.hibernate.exception.SQLGrammarException: could not execute query
    at com.liferay.portal.dao.orm.hibernate.ExceptionTranslator.translate(ExceptionTranslator.java:30)
    at com.liferay.portal.dao.orm.hibernate.SQLQueryImpl.list(SQLQueryImpl.java:111)
    at com.liferay.portal.dao.orm.hibernate.SQLQueryImpl.list(SQLQueryImpl.java:88)
    at com.esquare.ecommerce.service.persistence.OrderFinderImpl.getTodayOrderCount(OrderFinderImpl.java:37)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:320)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at com.liferay.portal.dao.shard.advice.ShardPersistenceAdvice.invoke(ShardPersistenceAdvice.java:52)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at com.sun.proxy.$Proxy426.getTodayOrderCount(Unknown Source)
4

1 に答える 1

5

これは、コード内の次の行が原因で発生しています。

query.addEntity("Order", OrderImpl.class);

これは、SQL クエリがOrderエンティティを構築するためにすべての列を返す場合に使用されます。たとえば、上記のステートメントを使用するには、クエリを次のようにする必要があります。

SELECT * FROM EEC_ORDER

また、クエリはスカラー値を返す集計関数のみを返すため、単一の値であるため、count クエリでメソッドをCOUNT使用することはできません。addEntity

メソッドは結果セットを取得し、すべての列を 1 つずつ設定addEntityしてエンティティに設定しようとします。SQL クエリは列を返さないため、上記のように例外が発生します。Orderorder.setOrderId(resultSet.getLong("orderId"))orderId

では、どうすればよいのでしょうか。解決策を読んでください:

クエリで行っているように型のスカラーを返すには、メソッドlongの代わりに次を使用できます。addEntity

query.addScalar("countOfOrder", Type.LONG);

whereは、次のようなSQLクエリcountOfOrderのエイリアスに他なりませんcount

SELECT count(*) as "countOfOrder" FROM EEC_ORDER
于 2013-09-14T08:37:13.057 に答える