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.  [ 3 posts ] 
Author Message
 Post subject: JPA count(*) returns PropertyAccessException
PostPosted: Fri Jun 20, 2008 4:53 am 
Newbie

Joined: Fri Jun 20, 2008 4:47 am
Posts: 5
This is the first time I try something besides "from Users"...

The query runs fine in Eclipses HQL editor
select count(group_.id) from com.invenso.xb.isp.xbadminserver.database.objects.XbActionGroup group_ where group_.xbRole = 14 and group_.xbActionGroup is null

Trying it in code however throws this exception as if it tries to instantiate XbRole.

I can select "from XbRole" without exceptions.

Thanks in advance

Hibernate version:
3.2.6.ga

Mapping documents:
Code:
package com.invenso.xb.isp.xbadminserver.database.objects;

// Generated 19-jun-2008 11:20:25 by Hibernate Tools 3.2.2.GA

import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

/**
* XbActionGroup generated by hbm2java
*/
@Entity
@Table(name = "xb_action_group", uniqueConstraints = @UniqueConstraint(columnNames = {
      "name", "parent_id", "role_id" }))
public class XbActionGroup implements java.io.Serializable {

   private Integer id;
   private XbActionGroup xbActionGroup;
   private String name;
   private String description;
   private XbRole xbRole;
   private Set<XbActionGroup> xbActionGroups = new HashSet<XbActionGroup>(0);
   private Set<XbAction> xbActions = new HashSet<XbAction>(0);

   public XbActionGroup() {
   }

   public XbActionGroup(String name) {
      this.name = name;
   }

   public XbActionGroup(XbActionGroup xbActionGroup, String name,
         String description, XbRole role,
         Set<XbActionGroup> xbActionGroups, Set<XbAction> xbActions) {
      this.xbActionGroup = xbActionGroup;
      this.name = name;
      this.description = description;
      this.xbRole = role;
      this.xbActionGroups = xbActionGroups;
      this.xbActions = xbActions;
   }

   @Id
   @GeneratedValue(strategy = IDENTITY)
   @Column(name = "id", unique = true, nullable = false)
   public Integer getId() {
      return this.id;
   }

   public void setId(Integer id) {
      this.id = id;
   }

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "parent_id")
   public XbActionGroup getXbActionGroup() {
      return this.xbActionGroup;
   }

   public void setXbActionGroup(XbActionGroup xbActionGroup) {
      this.xbActionGroup = xbActionGroup;
   }

   @Column(name = "name", nullable = false)
   public String getName() {
      return this.name;
   }

   public void setName(String name) {
      this.name = name;
   }

   @Column(name = "description")
   public String getDescription() {
      return this.description;
   }

   public void setDescription(String description) {
      this.description = description;
   }

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "role_id")
   public XbRole getXbRole() {
      return this.xbRole;
   }

   public void setXbRole(XbRole xbRole) {
      this.xbRole = xbRole;
   }

   @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "xbActionGroup")
   public Set<XbActionGroup> getXbActionGroups() {
      return this.xbActionGroups;
   }

   public void setXbActionGroups(Set<XbActionGroup> xbActionGroups) {
      this.xbActionGroups = xbActionGroups;
   }

   @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "xbActionGroup")
   public Set<XbAction> getXbActions() {
      return this.xbActions;
   }

   public void setXbActions(Set<XbAction> xbActions) {
      this.xbActions = xbActions;
   }

}


Code between sessionFactory.openSession() and session.close():
Code:
Query query = getEntityManager()
            .createQuery(
                  "select count(group_.id) from XbActionGroup group_ where group_.xbRole = ?1 and group_.xbActionGroup is null");
      query = query.setParameter(1, role_id);
      Object res = query.getSingleResult();
      return (Integer) res;


Full stack trace of any exception that occurs:
Code:
javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of com.invenso.xb.isp.xbadminserver.database.objects.XbRole.id
   at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:637)
   at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:107)
   at com.invenso.xb.isp.xbadminserver.database.ActionRoleManager.getGroupCount(ActionRoleManager.java:694)
   at com.invenso.xb.isp.xbadminserver.database.ActionRoleManager.hasChildren(ActionRoleManager.java:722)
   at com.invenso.xb.isp.xbadminserver.database.ActionRoleManager.getActions(ActionRoleManager.java:52)
   at com.invenso.xb.isp.xbadminserver.qmgr.ActionManager.initialize(ActionManager.java:61)
   at com.invenso.xb.isp.xbadminserver.qmgr.ActionManager.<init>(ActionManager.java:19)
   at com.invenso.xb.isp.xbadminserver.qmgr.RoleQueueManager.<init>(RoleQueueManager.java:21)
   at com.invenso.xb.isp.xbadminserver.qmgr.GlobalQueueManager.initialize(GlobalQueueManager.java:31)
   at com.invenso.xb.isp.xbadminserver.AdminServerClass.Initialize(AdminServerClass.java:184)
   at com.invenso.xb.isp.xbadminserver.AdminServerClass.main(AdminServerClass.java:278)
Caused by: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of com.invenso.xb.isp.xbadminserver.database.objects.XbRole.id
   at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:171)
   at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:183)
   at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3596)
   at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3312)
   at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:181)
   at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:218)
   at org.hibernate.type.EntityType.getIdentifier(EntityType.java:397)
   at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:87)
   at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:38)
   at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:491)
   at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1563)
   at org.hibernate.loader.Loader.doQuery(Loader.java:673)
   at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
   at org.hibernate.loader.Loader.doList(Loader.java:2213)
   at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
   at org.hibernate.loader.Loader.list(Loader.java:2099)
   at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
   at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
   at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
   at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
   at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
   at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:81)
   ... 9 more
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
   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.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:145)
   ... 30 more


Name and version of the database you are using:
MySQL 4

The generated SQL (show_sql=true):
select count(xbactiongr0_.id) as col_0_0_ from xb_action_group xbactiongr0_ where xbactiongr0_.role_id=? and (xbactiongr0_.parent_id is null)

Debug level Hibernate log excerpt:
Code:
10:11:19,529 [                                     main] [DEBUG] opened session at timestamp: 12139494794
10:11:19,603 [                                     main] [DEBUG] parse() - HQL: select count(group_.id) from com.invenso.xb.isp.xbadminserver.database.objects.XbActionGroup group_ where group_.xbRole = ?1 and group_.xbActionGroup is null
10:11:19,626 [                                     main] [DEBUG] --- HQL AST ---
\-[QUERY] 'query'
    +-[SELECT_FROM] 'SELECT_FROM'
    |  +-[FROM] 'from'
    |  |  \-[RANGE] 'RANGE'
    |  |     +-[DOT] '.'
    |  |     |  +-[DOT] '.'
    |  |     |  |  +-[DOT] '.'
    |  |     |  |  |  +-[DOT] '.'
    |  |     |  |  |  |  +-[DOT] '.'
    |  |     |  |  |  |  |  +-[DOT] '.'
    |  |     |  |  |  |  |  |  +-[DOT] '.'
    |  |     |  |  |  |  |  |  |  +-[IDENT] 'com'
    |  |     |  |  |  |  |  |  |  \-[IDENT] 'invenso'
    |  |     |  |  |  |  |  |  \-[IDENT] 'xb'
    |  |     |  |  |  |  |  \-[IDENT] 'isp'
    |  |     |  |  |  |  \-[IDENT] 'xbadminserver'
    |  |     |  |  |  \-[IDENT] 'database'
    |  |     |  |  \-[IDENT] 'objects'
    |  |     |  \-[IDENT] 'XbActionGroup'
    |  |     \-[ALIAS] 'group_'
    |  \-[SELECT] 'select'
    |     \-[COUNT] 'count'
    |        \-[DOT] '.'
    |           +-[IDENT] 'group_'
    |           \-[IDENT] 'id'
    \-[WHERE] 'where'
       \-[AND] 'and'
          +-[EQ] '='
          |  +-[DOT] '.'
          |  |  +-[IDENT] 'group_'
          |  |  \-[IDENT] 'xbRole'
          |  \-[PARAM] '?'
          |     \-[NUM_INT] '1'
          \-[IS_NULL] 'is null'
             \-[DOT] '.'
                +-[IDENT] 'group_'
                \-[IDENT] 'xbActionGroup'

10:11:19,626 [                                     main] [DEBUG] throwQueryException() : no errors
10:11:19,683 [                                     main] [DEBUG] select << begin [level=1, statement=select]
10:11:19,706 [                                     main] [DEBUG] FromClause{level=1} :  com.invenso.xb.isp.xbadminserver.database.objects.XbActionGroup (group_) -> xbactiongr0_
10:11:19,709 [                                     main] [DEBUG] Resolved :  group_ -> xbactiongr0_.id
10:11:19,710 [                                     main] [DEBUG] getDataType() : id -> org.hibernate.type.IntegerType@53f89f
10:11:19,711 [                                     main] [DEBUG] Resolved :  group_.id -> xbactiongr0_.id
10:11:19,731 [                                     main] [DEBUG] Resolved :  group_ -> xbactiongr0_.id
10:11:19,731 [                                     main] [DEBUG] getDataType() : xbRole -> org.hibernate.type.ManyToOneType(com.invenso.xb.isp.xbadminserver.database.objects.XbRole)
10:11:19,731 [                                     main] [DEBUG] dereferenceShortcut() : property xbRole in com.invenso.xb.isp.xbadminserver.database.objects.XbActionGroup does not require a join.
10:11:19,731 [                                     main] [DEBUG] terminal propertyPath = [xbRole]
10:11:19,731 [                                     main] [DEBUG] Resolved :  group_.xbRole -> xbactiongr0_.role_id
10:11:19,740 [                                     main] [DEBUG] Resolved :  group_ -> xbactiongr0_.id
10:11:19,740 [                                     main] [DEBUG] getDataType() : xbActionGroup -> org.hibernate.type.ManyToOneType(com.invenso.xb.isp.xbadminserver.database.objects.XbActionGroup)
10:11:19,740 [                                     main] [DEBUG] dereferenceShortcut() : property xbActionGroup in com.invenso.xb.isp.xbadminserver.database.objects.XbActionGroup does not require a join.
10:11:19,740 [                                     main] [DEBUG] terminal propertyPath = [xbActionGroup]
10:11:19,740 [                                     main] [DEBUG] Resolved :  group_.xbActionGroup -> xbactiongr0_.parent_id
10:11:19,740 [                                     main] [DEBUG] select : finishing up [level=1, statement=select]
10:11:19,741 [                                     main] [DEBUG] processQuery() :  ( SELECT ( {select clause} ( count ( xbactiongr0_.id xbactiongr0_.id id ) ) ) ( FromClause{level=1} xb_action_group xbactiongr0_ ) ( where ( and ( = ( xbactiongr0_.role_id xbactiongr0_.id xbRole ) ? ) ( is null ( xbactiongr0_.parent_id xbactiongr0_.id xbActionGroup ) ) ) ) )
10:11:19,750 [                                     main] [DEBUG] Using FROM fragment [xb_action_group xbactiongr0_]
10:11:19,750 [                                     main] [DEBUG] select >> end [level=1, statement=select]
10:11:19,756 [                                     main] [DEBUG] --- SQL AST ---
\-[SELECT] QueryNode: 'SELECT'  querySpaces (xb_action_group)
    +-[SELECT_CLAUSE] SelectClause: '{select clause}'
    |  +-[COUNT] CountNode: 'count'
    |  |  \-[DOT] DotNode: 'xbactiongr0_.id' {propertyName=id,dereferenceType=4,propertyPath=id,path=group_.id,tableAlias=xbactiongr0_,className=com.invenso.xb.isp.xbadminserver.database.objects.XbActionGroup,classAlias=group_}
    |  |     +-[ALIAS_REF] IdentNode: 'xbactiongr0_.id' {alias=group_, className=com.invenso.xb.isp.xbadminserver.database.objects.XbActionGroup, tableAlias=xbactiongr0_}
    |  |     \-[IDENT] IdentNode: 'id' {originalText=id}
    |  \-[SELECT_COLUMNS] SqlNode: ' as col_0_0_'
    +-[FROM] FromClause: 'from' FromClause{level=1, fromElementCounter=1, fromElements=1, fromElementByClassAlias=[group_], fromElementByTableAlias=[xbactiongr0_], fromElementsByPath=[], collectionJoinFromElementsByPath=[], impliedElements=[]}
    |  \-[FROM_FRAGMENT] FromElement: 'xb_action_group xbactiongr0_' FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=group_,role=null,tableName=xb_action_group,tableAlias=xbactiongr0_,origin=null,colums={,className=com.invenso.xb.isp.xbadminserver.database.objects.XbActionGroup}}
    \-[WHERE] SqlNode: 'where'
       \-[AND] SqlNode: 'and'
          +-[EQ] BinaryLogicOperatorNode: '='
          |  +-[DOT] DotNode: 'xbactiongr0_.role_id' {propertyName=xbRole,dereferenceType=ROOT_LEVEL,propertyPath=xbRole,path=group_.xbRole,tableAlias=xbactiongr0_,className=com.invenso.xb.isp.xbadminserver.database.objects.XbActionGroup,classAlias=group_}
          |  |  +-[ALIAS_REF] IdentNode: 'xbactiongr0_.id' {alias=group_, className=com.invenso.xb.isp.xbadminserver.database.objects.XbActionGroup, tableAlias=xbactiongr0_}
          |  |  \-[IDENT] IdentNode: 'xbRole' {originalText=xbRole}
          |  \-[NAMED_PARAM] ParameterNode: '?' {name=1, expectedType=org.hibernate.type.ManyToOneType(com.invenso.xb.isp.xbadminserver.database.objects.XbRole)}
          \-[IS_NULL] IsNullLogicOperatorNode: 'is null'
             \-[DOT] DotNode: 'xbactiongr0_.parent_id' {propertyName=xbActionGroup,dereferenceType=ROOT_LEVEL,propertyPath=xbActionGroup,path=group_.xbActionGroup,tableAlias=xbactiongr0_,className=com.invenso.xb.isp.xbadminserver.database.objects.XbActionGroup,classAlias=group_}
                +-[ALIAS_REF] IdentNode: 'xbactiongr0_.id' {alias=group_, className=com.invenso.xb.isp.xbadminserver.database.objects.XbActionGroup, tableAlias=xbactiongr0_}
                \-[IDENT] IdentNode: 'xbActionGroup' {originalText=xbActionGroup}

10:11:19,756 [                                     main] [DEBUG] throwQueryException() : no errors
10:11:19,768 [                                     main] [DEBUG] HQL: select count(group_.id) from com.invenso.xb.isp.xbadminserver.database.objects.XbActionGroup group_ where group_.xbRole = ?1 and group_.xbActionGroup is null
10:11:19,768 [                                     main] [DEBUG] SQL: select count(xbactiongr0_.id) as col_0_0_ from xb_action_group xbactiongr0_ where xbactiongr0_.role_id=? and (xbactiongr0_.parent_id is null)
10:11:19,768 [                                     main] [DEBUG] throwQueryException() : no errors
10:11:19,797 [                                     main] [DEBUG] about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
10:11:19,797 [                                     main] [DEBUG] opening JDBC connection
10:11:19,797 [                                     main] [DEBUG] trace com.mchange.v2.resourcepool.BasicResourcePool@1c8ad52 [managed: 5, unused: 4, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@114a3c6)
10:11:19,797 [                                     main] [DEBUG] select count(xbactiongr0_.id) as col_0_0_ from xb_action_group xbactiongr0_ where xbactiongr0_.role_id=? and (xbactiongr0_.parent_id is null)
10:11:19,808 [                                     main] [DEBUG] cxnStmtMgr.statementSet( com.mysql.jdbc.Connection@1c4bcda ).size(): 1
10:11:19,808 [                                     main] [DEBUG] checkoutStatement: com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache stats -- total size: 1; checked out: 1; num connections: 1; num keys: 1
10:11:19,816 [                                     main] [ERROR] IllegalArgumentException in class: com.invenso.xb.isp.xbadminserver.database.objects.XbRole, getter method of property: id
10:11:19,816 [                                     main] [DEBUG] about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
10:11:19,816 [                                     main] [DEBUG] checkinStatement(): com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache stats -- total size: 1; checked out: 0; num connections: 1; num keys: 1
10:11:19,816 [                                     main] [DEBUG] aggressively releasing JDBC connection
10:11:19,816 [                                     main] [DEBUG] releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
10:11:19,818 [                                     main] [DEBUG] checkinAll(): com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache stats -- total size: 1; checked out: 0; num connections: 1; num keys: 1
10:11:19,819 [                                     main] [DEBUG] trace com.mchange.v2.resourcepool.BasicResourcePool@1c8ad52 [managed: 5, unused: 4, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@114a3c6)
10:11:19,819 [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2] [DEBUG] checkinAll(): com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache stats -- total size: 1; checked out: 0; num connections: 1; num keys: 1
10:11:19,819 [                                     main] [DEBUG] aggressively releasing JDBC connection
10:11:19,819 [                                     main] [DEBUG] mark transaction for rollback


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jun 20, 2008 5:36 am 
Newbie

Joined: Fri Jun 20, 2008 4:47 am
Posts: 5
This is solved:

* Apparently, although the HQL editor can execute the query, it should actually be:
select count(group_.id) from XbActionGroup group_ where group_.xbRole.id = ?1 and group_.xbActionGroup is null

which makes sense, as Java cannot compare int and XbRole. I thought it was a feature of HQL though.

* The result of count() is Long, not Integer.


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jun 23, 2008 11:11 am 
Expert
Expert

Joined: Tue May 13, 2008 3:42 pm
Posts: 919
Location: Toronto & Ajax Ontario www.hibernatemadeeasy.com
Thanks for the update!

_________________
Cameron McKenzie - Author of "Hibernate Made Easy" and "What is WebSphere?"
http://www.TheBookOnHibernate.com Check out my 'easy to follow' Hibernate & JPA Tutorials


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 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.