[hibernate-issues] [Hibernate-JIRA] Commented: (HB-281) ".class" with <joined-subclass> problem

Daniel Thompson (JIRA) noreply at atlassian.com
Wed Nov 15 15:35:05 EST 2006


    [ http://opensource.atlassian.com/projects/hibernate/browse/HB-281?page=comments#action_25310 ] 

Daniel Thompson commented on HB-281:
------------------------------------

I wish my project was not a high priority.

> ".class" with <joined-subclass> problem
> ---------------------------------------
>
>          Key: HB-281
>          URL: http://opensource.atlassian.com/projects/hibernate/browse/HB-281
>      Project: Hibernate2
>         Type: Bug

>   Components: core
>  Environment: windows 2000
>     Reporter: Simone Ricciardi
>     Priority: Minor

>
>
> I've acknowledged an error that happens using "select count (*) ..." 
> together to a where clause "... where alias.class = ClassName ". 
> Suppose to have two classes: 
> public class Foo
> {
> String id;
> String attr1;
> public String getId(){ return id; }
> public void setId(String id){ this.id = id; }
> public String getAttr1(){ return attr1; }
> public void setAttr1(String attr1){ this.attr1 = attr1; }
> }
> public class Bar extends Foo
> {
> String attr2;
> public String getAttr2(){ return attr2; }
> public void setAttr2(String attr2){ this.attr2 = attr2; }
> }
> and the corresponding mapping file: 
> <hibernate-mapping>
> <class name="test.persistents.Foo" table="Foo">
> <id name="id" type="string">
> <column name="id" length="32"/>
> <generator class="uuid.hex"/>
> </id>
> <property name="attr1" column="attr1" type="string"/>
> <joined-subclass name="test.persistents.Bar" table="Bar">
> <key column="foo_id"/>
> <property name="attr2" column="attr2" type="string"/>
> </joined-subclass>
> </class>
> </hibernate-mapping>
> When I try to make the following query: 
> Query query = session.createQuery("select count(*) from Foo foo where foo.class = Foo"); 
> I get an error of this type:
> java.sql.SQLException: General error, message from server: "Unknown table 'foo0__1' in where clause"
> at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:1651)
> at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:889)
> at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:956)
> at com.mysql.jdbc.Connection.execSQL(Connection.java:1874)
> at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1538)
> at com.p6spy.engine.logging.P6LogPreparedStatement.executeQuery(P6LogPreparedStatement.java:171)
> at net.sf.hibernate.impl.BatcherImpl.getResultSet(BatcherImpl.java:71)
> at net.sf.hibernate.loader.Loader.getResultSet(Loader.java:551)
> at net.sf.hibernate.loader.Loader.doFind(Loader.java:140)
> at net.sf.hibernate.loader.Loader.find(Loader.java:620)
> at net.sf.hibernate.hql.QueryTranslator.find(QueryTranslator.java:928)
> at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:1343)
> at net.sf.hibernate.impl.QueryImpl.list(QueryImpl.java:76)
> at test.Test.main(Test.java:42)
> 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:324)
> while if I perform the same query without the select count(*) (select foo from Foo foo where foo.class = Foo) 
> all works fine.
> Comparing the two queries produced by hibernate in both cases, 
> it seems that the error derives from the lack of the "left outer join" with the Bar table in the "from" clause:
> with select count(*):
> select count(*) as x0_0_ 
> from Foo foo0_ 
> where (case when foo0__1.foo_id is not null then 1 when foo0_.id is not null then 0 end=0 )
> without select count(*):
> select foo0_.id as id, 
> case when foo0__1.foo_id is not null then 1 
> when foo0_.id is not null then 0 end 
> as clazz_, 
> foo0_.attr1 as attr10_, 
> foo0__1.attr2 as attr21_ 
> from Foo foo0_ left outer join Bar foo0__1 on foo0_.id=foo0__1.foo_id 
> where (case when foo0__1.foo_id is not null then 1 when foo0_.id is not null then 0 end=0 )
> in fact the query should be the following:
> select count(*) as x0_0_ 
> from Foo foo0_ left outer join Bar foo0__1 on foo0_.id=foo0__1.foo_id 
> where (case when foo0__1.foo_id is not null then 1 when foo0_.id is not null then 0 end=0 )

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira




More information about the hibernate-issues mailing list