-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 
Author Message
 Post subject: Cannot execute a native query - JDBC exception unexplainable
PostPosted: Wed Jan 31, 2007 6:56 pm 
Regular
Regular

Joined: Mon Nov 14, 2005 7:33 pm
Posts: 73
I'm simply trying to map a native query to a single entity but am having no luck. I'm using JBoss 4.0.5.GA w/ Hibernate 3.2.2, Anno. 3.2.2 (svn), and EM 3.2.1. I've tried reverting to stock JBoss 4.0.5 but the issue remains.

The entity w/ native query:

Code:
@Entity
@Table(name="pub.\"ord-traf\"")
@NamedNativeQuery(
  name="orderTrafficQuery",
  query="select max(ot.\"load-no\") as loadNo, max(ot.\"truck-no\") as truckNo, " +
        "max(ot.\"trailer-no\") as trailerNo, max(ot.\"carrier-no\") as carrierNo, " +
       "max(ot.\"ship-date\") as shipDate, max(ot.\"spec-instr\") as specInstr, " +
       "max(ot.\"est-freight\") as estFreight, max(ot.\"act-freight\") as actFreight, " +
       "max(ot.\"lock-load\") as lockLoad, max(v.\"Name\") as vendorName, " +
       "count(otd.\"order-no\") as customerCount " +
       "from pub.\"ord-traf\" ot " +
       "left join pub.\"vendor\" v on v.\"Vendor-code\" = ot.\"carrier-no\" " +
       "left join pub.\"ord-traf-d\" otd on otd.\"load-no\" = ot.\"load-no\" " +
       "where ot.\"ship-date\" = ? " +
       "group by ot.\"carrier-no\"",
  resultSetMapping="orderTrafficResult")
@SqlResultSetMapping(name="orderTrafficResult", entities={
    @EntityResult(entityClass=OrderTraffic.class, fields={
        @FieldResult(name="loadNo", column="loadNo"),
        @FieldResult(name="truckNo", column="truckNo"),
        @FieldResult(name="trailerNo", column="trailerNo"),
        @FieldResult(name="carrierNo", column="carrierNo"),
        @FieldResult(name="shipDate", column="shipDate"),
        @FieldResult(name="specInstr", column="specInstr"),
        @FieldResult(name="estFreight", column="estFreight"),
        @FieldResult(name="actFreight", column="actFreight"),
        @FieldResult(name="lockLoad", column="lockLoad"),
        @FieldResult(name="vendorName", column="vendorName"),
        @FieldResult(name="customerCount", column="customerCount")})})
public class OrderTraffic implements Serializable
{
   @Id
   @Column(name="`load-no`", nullable=false)
   private String loadNo;
   
  @Column(name="`truck-no`")
  private String truckNo;

  @Column(name="`trailer-no`")
  private String trailerNo;

  @Column(name="`carrier-no`")
  private String carrierNo;

  @Column(name="`ship-date`")
  @Temporal(TemporalType.DATE)
  private Date shipDate;

  @Column(name="`spec-instr`")
  private String specInstr;

  @Column(name="`est-freight`")
  private BigDecimal estFreight;

  @Column(name="`act-freight`")
  private BigDecimal actFreight;

  @Column(name="`lock-load`")
  private Boolean lockLoad;
 
  @Transient
  private String vendorName;
 
  @Transient
  private Integer customerCount;
.......................................
}


...queried like so:

Code:
  public List<OrderTraffic> getOrderTraffic(Date shipDate)
  {
    Query q = this.em.createNamedQuery("orderTrafficQuery");
   
    q.setParameter(1, shipDate);
   
    return q.getResultList();
  }


...throws an exception:

Code:
14:42:42,342 INFO  [STDOUT] Hibernate:
    /* named native SQL query orderTrafficQuery */ select
        max(ot."load-no") as loadNo,
        max(ot."truck-no") as truckNo,
        max(ot."trailer-no") as trailerNo,
        max(ot."carrier-no") as carrierNo,
        max(ot."ship-date") as shipDate,
        max(ot."spec-instr") as specInstr,
        max(ot."est-freight") as estFreight,
        max(ot."act-freight") as actFreight,
        max(ot."lock-load") as lockLoad,
        max(v."Name") as vendorName,
        count(otd."order-no") as customerCount
    from
        pub."ord-traf" ot
    left join
        pub."vendor" v
            on v."Vendor-code" = ot."carrier-no"
    left join
        pub."ord-traf-d" otd
            on otd."load-no" = ot."load-no"
    where
        ot."ship-date" = ?
    group by
        ot."carrier-no"
14:42:42,633 INFO  [StringType] could not read column value from result set: carrier4_562_0_; [DataDirect][OpenEdge JDBC Driver]Invalid column name: carrier4_562_0_
14:42:42,733 WARN  [JDBCExceptionReporter] SQL Error: 0, SQLState: 42S22
14:42:42,733 ERROR [JDBCExceptionReporter] [DataDirect][OpenEdge JDBC Driver]Invalid column name: carrier4_562_0_
14:42:42,813 ERROR [[Test]] Servlet.service() for servlet Test threw exception
javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute query
   at org.jboss.ejb3.tx.Ejb3TxPolicy.handleExceptionInOurTx(Ejb3TxPolicy.java:69)
   at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:83)
   at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191)
   at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
   at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
   at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
   at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
   at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
   at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
   at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:102)
   at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
   at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47)
   at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
   at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
   at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
   at org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:211)
   at org.jboss.ejb3.stateless.StatelessLocalProxy.invoke(StatelessLocalProxy.java:79)
   at $Proxy1027.getOrderTraffic(Unknown Source)
   at com.myapp.portlets.ui.servlet.Test.doGet(Test.java:48)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:697)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
   at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
   at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
   at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
   at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
   at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
   at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
   at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
   at org.jboss.web.tomcat.tc5.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:156)
   at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
   at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
   at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
   at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
   at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
   at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
   at java.lang.Thread.run(Thread.java:619)
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute query
   at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:647)
   at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:73)
   at com.myapp.session.OrderBean.getOrderTraffic(OrderBean.java:56)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112)
   at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166)
   at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63)
   at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
   at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54)
   at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
   at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:46)
   at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
   at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79)
   ... 38 more
Caused by: org.hibernate.exception.SQLGrammarException: could not execute query
   at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
   at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
   at org.hibernate.loader.Loader.doList(Loader.java:2214)
   at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2095)
   at org.hibernate.loader.Loader.list(Loader.java:2090)
   at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
   at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
   at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
   at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152)
   at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:64)
   ... 52 more
Caused by: java.sql.SQLException: [DataDirect][OpenEdge JDBC Driver]Invalid column name: carrier4_562_0_
   at com.ddtek.jdbc.base.BaseExceptions.createException(Unknown Source)
   at com.ddtek.jdbc.base.BaseExceptions.getException(Unknown Source)
   at com.ddtek.jdbc.base.BaseResultSet.getColumnOrdinal(Unknown Source)
   at com.ddtek.jdbc.base.BaseResultSet.getString(Unknown Source)
   at org.jboss.resource.adapter.jdbc.WrappedResultSet.getString(WrappedResultSet.java:880)
   at org.hibernate.type.StringType.get(StringType.java:18)
   at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:163)
   at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:154)
   at org.hibernate.type.ManyToOneType.hydrate(ManyToOneType.java:103)
   at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2092)
   at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1371)
   at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1299)
   at org.hibernate.loader.Loader.getRow(Loader.java:1197)
   at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:568)
   at org.hibernate.loader.Loader.doQuery(Loader.java:689)
   at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
   at org.hibernate.loader.Loader.doList(Loader.java:2211)
   ... 59 more


However if I take the raw query generated below and run it against the db, it works just fine:

Code:
select
        max(ot."load-no") as loadNo,
        max(ot."truck-no") as truckNo,
        max(ot."trailer-no") as trailerNo,
        max(ot."carrier-no") as carrierNo,
        max(ot."ship-date") as shipDate,
        max(ot."spec-instr") as specInstr,
        max(ot."est-freight") as estFreight,
        max(ot."act-freight") as actFreight,
        max(ot."lock-load") as lockLoad,
        max(v."Name") as vendorName,
        count(otd."order-no") as customerCount
    from
        pub."ord-traf" ot
    left join
        pub."vendor" v
            on v."Vendor-code" = ot."carrier-no"
    left join
        pub."ord-traf-d" otd
            on otd."load-no" = ot."load-no"
    where
        ot."ship-date" = '1/10/2007'
    group by
        ot."carrier-no"


I've tried leaving out the last two columns (which are transient in the entity) and I've also tried the query w/o aggregation...it fails w/ the same exception regardless.

I *also* tried removing the carrier-no field from the query and the entity since that's the one that's having an issue in the case above. However, it just picks another field to complain about.

Any ideas?

Thanks!

EDIT

I was able to reproduce this on a small sample project that runs against MSSQL 2000 - with or without quotes this does not work...I get the same exception w/ the strange table alias name.


Top
 Profile  
 
 Post subject:
PostPosted: Sat Feb 03, 2007 7:32 pm 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
can you create a minimal runable test case (if possible with a couple of fields) and post it to JIRA?

_________________
Emmanuel


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.