I have an HQL statement that is missing a join clause in the generated SQL. The entity is using a hierarchy with joined subclass. I am using annotations to define the mapping. I want to query based on a subclass property, so hibernate has to do a "downcast" of some sort. Here's the HQL:
Code:
select pound.location.state from "+Pound.class.getName()+" as pound inner join pound.cats as cat where pound.location.name='Anytown' and cat.meanness > 5
This works fine if I do not have the select clause, when I add the select clause it fails and removes the join for the subclass "Bobcat", which has the property "meanness". I have included a full test case including configuration.
This looks related to the recently fixed bug HHH-1248.
I do not think I am doing anything incorrect here, any help?
Hibernate version: Hibernate 3.1.3
Annotations 3.1 beta 8
Full test caseCode:
package com.i2rd.occasio.test;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import javax.persistence.*;
import org.hibernate.*;
import org.hibernate.cfg.*;
import org.hibernate.tool.hbm2ddl.SchemaUpdate;
import org.hibernate.validator.NotNull;
/**
* Test for broken hibernate down cast.
*/
public class BrokenHibernateDowncast
{
@Entity
@Table(name="cat")
@Inheritance(strategy=InheritanceType.JOINED)
public static class Cat
{
@Id @GeneratedValue(strategy=GenerationType.AUTO, generator="cat_id_seq")
@NotNull
@javax.persistence.SequenceGenerator(
name="cat_id_seq",
sequenceName="cat_id_seq"
)
long id;
String name;
}
@Entity
@Table(name="domesticcat")
public static class DomesticCat extends Cat
{
String region;
}
@Entity
@Table(name="bobcat")
public static class Bobcat extends Cat
{
int meanness;
}
@Entity
@Table(name="dog")
@Inheritance(strategy=InheritanceType.JOINED)
public static class Dog
{
@Id @GeneratedValue(strategy=GenerationType.AUTO, generator="dog_id_seq")
@NotNull
@javax.persistence.SequenceGenerator(
name="dog_id_seq",
sequenceName="dog_id_seq"
)
long id;
String name;
}
@Entity
public static class ToyDog extends Dog
{
int tinyness;
}
@Entity
public static class LargeDog extends Dog
{
int largeness;
}
@Entity
@Table(name="city")
public static class City
{
@Id @GeneratedValue(strategy=GenerationType.AUTO, generator="city_id_seq")
@NotNull
@javax.persistence.SequenceGenerator(
name="city_id_seq",
sequenceName="city_id_seq"
)
long id;
String name;
String state;
}
@Entity
@Table(name="pound")
public static class Pound
{
@Id @GeneratedValue(strategy=GenerationType.AUTO, generator="pound_id_seq")
@NotNull
@javax.persistence.SequenceGenerator(
name="pound_id_seq",
sequenceName="pound_id_seq"
)
long id;
@ManyToOne
@NotNull
City location;
@OneToMany
Set<Cat> cats = new HashSet<Cat>();
@OneToMany
Set<Dog> dogs = new HashSet<Dog>();
}
public static void main(String[] args) throws Exception
{
Properties props = new Properties();
props.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
props.put("hibernate.connection.driver_class", "org.postgresql.Driver");
props.put("hibernate.connection.url", "jdbc:postgresql://localhost/thepound");
props.put("hibernate.connection.username", "whatever");
props.put("hibernate.connection.password", "");
props.put("hibernate.show_sql", "true");
props.put("hibernate.format_sql", "true");
props.put("hibernate.connection.release_mode", "on_close");
props.put("hibernate.hbm2ddl.auto", "create");
Configuration cfg = new AnnotationConfiguration()
.addAnnotatedClass(Pound.class)
.addAnnotatedClass(Cat.class)
.addAnnotatedClass(DomesticCat.class)
.addAnnotatedClass(Bobcat.class)
.addAnnotatedClass(City.class)
.addAnnotatedClass(Dog.class)
.addAnnotatedClass(ToyDog.class)
.addAnnotatedClass(LargeDog.class)
.setProperties(props);
SchemaUpdate update = new SchemaUpdate(cfg, props);
update.execute(true, true);
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
City anytown = new City();
anytown.name = "Anytown";
anytown.state = "NE";
session.save(anytown);
DomesticCat dc = new DomesticCat();
dc.name="charley";
dc.region="Midwest USA";
session.save(dc);
Bobcat bc = new Bobcat();
bc.name="bobby";
bc.meanness=10;
session.save(bc);
ToyDog poodle = new ToyDog();
poodle.name="fifi";
poodle.tinyness = 1;
session.save(poodle);
LargeDog dob = new LargeDog();
dob.name="max";
dob.largeness = 100;
session.save(dob);
Pound pound = new Pound();
pound.location = anytown;
pound.cats.add(dc);
pound.cats.add(bc);
pound.dogs.add(poodle);
pound.dogs.add(dob);
session.save(pound);
session.flush();
// This works:
System.out.println(session.createQuery("from "+Pound.class.getName()
+" as pound inner join pound.cats as cat left join pound.dogs as dog where pound.location.name='Anytown' and cat.meanness > 5").list());
// This does not: the difference being the select clause, the extra 'left join' does not seem to make a difference
System.out.println(session.createQuery("select pound.location.state from "+Pound.class.getName()
+" as pound inner join pound.cats as cat where pound.location.name='Anytown' and cat.meanness > 5").list());
// This does not: the difference being the select clause
System.out.println(session.createQuery("select pound.location.state from "+Pound.class.getName()
+" as pound inner join pound.cats as cat left join pound.dogs as dog where pound.location.name='Anytown' and cat.meanness > 5").list());
session.close();
}
private BrokenHibernateDowncast()
{
super();
}
}
Full stack trace of any exception that occurs:Code:
06-03-22 15:05:24,467 WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 42P01
2006-03-22 15:05:24,469 ERROR org.hibernate.util.JDBCExceptionReporter - ERROR: missing FROM-clause entry for table "brokenhibe2_2_"
Exception in thread "main" 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:2148)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
at org.hibernate.loader.Loader.list(Loader.java:2024)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
at com.i2rd.occasio.test.BrokenHibernateDowncast.main(BrokenHibernateDowncast.java:179)
Caused by: org.postgresql.util.PSQLException: ERROR: missing FROM-clause entry for table "brokenhibe2_2_"
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1512)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1297)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:188)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:437)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:353)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:257)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:139)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1669)
at org.hibernate.loader.Loader.doQuery(Loader.java:662)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2145)
... 8 more
Name and version of the database you are using:PostgreSQL 8.1.3
The generated SQL (show_sql=true):You can see the join that should be there for "Bobcat", aliased as "brokenhibe2_2_" is missing, although the query references it.
Code:
select
brokenhibe3_.state as col_0_0_
from
pound brokenhibe0_
inner join
pound_cat cats1_
on brokenhibe0_.id=cats1_.pound_id
inner join
cat brokenhibe2_
on cats1_.cats_id=brokenhibe2_.id,
city brokenhibe3_
where
brokenhibe0_.location_id=brokenhibe3_.id
and brokenhibe3_.name='Anytown'
and brokenhibe2_2_.meanness>5
Debug level Hibernate log excerpt:Code:
2006-03-22 15:18:18,127 DEBUG [null main] query.QueryPlanCache (QueryPlanCache.java:69) - unable to locate HQL query plan in cache; generating (select pound.location.state from com.i2rd.occasio.test.BrokenHibernateDowncast$Pound as pound inner join pound.cats as cat where pound.location.name='Anytown' and cat.meanness > 5)
2006-03-22 15:18:18,129 DEBUG [null main] ast.QueryTranslatorImpl (QueryTranslatorImpl.java:236) - parse() - HQL: select pound.location.state from com.i2rd.occasio.test.BrokenHibernateDowncast$Pound as pound inner join pound.cats as cat where pound.location.name='Anytown' and cat.meanness > 5
2006-03-22 15:18:18,140 DEBUG [null main] ast.QueryTranslatorImpl (QueryTranslatorImpl.java:252) - --- HQL AST ---
\-[QUERY] 'query'
+-[SELECT_FROM] 'SELECT_FROM'
| +-[FROM] 'from'
| | +-[RANGE] 'RANGE'
| | | +-[DOT] '.'
| | | | +-[DOT] '.'
| | | | | +-[DOT] '.'
| | | | | | +-[DOT] '.'
| | | | | | | +-[IDENT] 'com'
| | | | | | | \-[IDENT] 'i2rd'
| | | | | | \-[IDENT] 'occasio'
| | | | | \-[IDENT] 'test'
| | | | \-[IDENT] 'BrokenHibernateDowncast$Pound'
| | | \-[ALIAS] 'pound'
| | \-[JOIN] 'join'
| | +-[INNER] 'inner'
| | +-[DOT] '.'
| | | +-[IDENT] 'pound'
| | | \-[IDENT] 'cats'
| | \-[ALIAS] 'cat'
| \-[SELECT] 'select'
| \-[DOT] '.'
| +-[DOT] '.'
| | +-[IDENT] 'pound'
| | \-[IDENT] 'location'
| \-[IDENT] 'state'
\-[WHERE] 'where'
\-[AND] 'and'
+-[EQ] '='
| +-[DOT] '.'
| | +-[DOT] '.'
| | | +-[IDENT] 'pound'
| | | \-[IDENT] 'location'
| | \-[IDENT] 'name'
| \-[QUOTED_STRING] ''Anytown''
\-[GT] '>'
+-[DOT] '.'
| +-[IDENT] 'cat'
| \-[IDENT] 'meanness'
\-[NUM_INT] '5'
2006-03-22 15:18:18,143 DEBUG [null main] ast.ErrorCounter (ErrorCounter.java:68) - throwQueryException() : no errors
2006-03-22 15:18:18,143 DEBUG [null main] antlr.HqlSqlBaseWalker (HqlSqlBaseWalker.java:111) - select << begin [level=1, statement=select]
2006-03-22 15:18:18,152 DEBUG [null main] tree.FromElement (FromElement.java:104) - FromClause{level=1} : com.i2rd.occasio.test.BrokenHibernateDowncast$Pound (pound) -> brokenhibe0_
2006-03-22 15:18:18,153 DEBUG [null main] tree.FromReferenceNode (FromReferenceNode.java:51) - Resolved : pound -> brokenhibe0_.id
2006-03-22 15:18:18,155 DEBUG [null main] tree.DotNode (DotNode.java:541) - getDataType() : cats -> org.hibernate.type.SetType(com.i2rd.occasio.test.BrokenHibernateDowncast$Pound.cats)
2006-03-22 15:18:18,156 DEBUG [null main] tree.FromElementFactory (FromElementFactory.java:368) - createManyToMany() : path = pound.cats role = com.i2rd.occasio.test.BrokenHibernateDowncast$Pound.cats associatedEntityName = com.i2rd.occasio.test.BrokenHibernateDowncast$Cat
2006-03-22 15:18:18,156 DEBUG [null main] tree.FromElement (FromElement.java:104) - FromClause{level=1} : com.i2rd.occasio.test.BrokenHibernateDowncast$Cat (cat) -> brokenhibe2_
2006-03-22 15:18:18,157 DEBUG [null main] tree.FromClause (FromClause.java:218) - addJoinByPathMap() : pound.cats -> cat brokenhibe2_
2006-03-22 15:18:18,158 DEBUG [null main] tree.DotNode (DotNode.java:265) - dereferenceCollection() : Created new FROM element for pound.cats : pound_cat brokenhibe2_
2006-03-22 15:18:18,158 DEBUG [null main] tree.FromReferenceNode (FromReferenceNode.java:51) - Resolved : pound.cats -> .
2006-03-22 15:18:18,164 DEBUG [null main] ast.HqlSqlWalker (HqlSqlWalker.java:327) - createFromJoinElement() : -- join tree --
\-[JOIN_FRAGMENT] FromElement: 'pound_cat brokenhibe2_' FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=cat,role=com.i2rd.occasio.test.BrokenHibernateDowncast$Pound.cats,tableName=cat,tableAlias=brokenhibe2_,origin=pound brokenhibe0_,colums={brokenhibe0_.id ,className=com.i2rd.occasio.test.BrokenHibernateDowncast$Cat}}
2006-03-22 15:18:18,165 DEBUG [null main] tree.FromReferenceNode (FromReferenceNode.java:51) - Resolved : pound -> brokenhibe0_.id
2006-03-22 15:18:18,168 DEBUG [null main] tree.DotNode (DotNode.java:541) - getDataType() : location -> org.hibernate.type.ManyToOneType(com.i2rd.occasio.test.BrokenHibernateDowncast$City)
2006-03-22 15:18:18,169 DEBUG [null main] tree.DotNode (DotNode.java:348) - dereferenceEntityJoin() : generating join for location in com.i2rd.occasio.test.BrokenHibernateDowncast$Pound {no alias} parent = [ ( . ( . brokenhibe0_.id location ) state ) ]
2006-03-22 15:18:18,169 DEBUG [null main] tree.FromElement (FromElement.java:104) - FromClause{level=1} : com.i2rd.occasio.test.BrokenHibernateDowncast$City (no alias) -> brokenhibe3_
2006-03-22 15:18:18,170 DEBUG [null main] tree.FromClause (FromClause.java:218) - addJoinByPathMap() : pound.location -> city brokenhibe3_
2006-03-22 15:18:18,170 DEBUG [null main] tree.FromReferenceNode (FromReferenceNode.java:51) - Resolved : pound.location -> brokenhibe0_.location_id
2006-03-22 15:18:18,171 DEBUG [null main] tree.DotNode (DotNode.java:541) - getDataType() : state -> org.hibernate.type.StringType@ea3932
2006-03-22 15:18:18,172 DEBUG [null main] tree.FromReferenceNode (FromReferenceNode.java:51) - Resolved : pound.location.state -> brokenhibe3_.state
2006-03-22 15:18:18,173 DEBUG [null main] tree.FromReferenceNode (FromReferenceNode.java:51) - Resolved : pound -> brokenhibe0_.id
2006-03-22 15:18:18,174 DEBUG [null main] tree.DotNode (DotNode.java:541) - getDataType() : location -> org.hibernate.type.ManyToOneType(com.i2rd.occasio.test.BrokenHibernateDowncast$City)
2006-03-22 15:18:18,174 DEBUG [null main] tree.DotNode (DotNode.java:348) - dereferenceEntityJoin() : generating join for location in com.i2rd.occasio.test.BrokenHibernateDowncast$Pound {no alias} parent = [ ( . ( . brokenhibe0_.id location ) name ) ]
2006-03-22 15:18:18,175 DEBUG [null main] tree.FromReferenceNode (FromReferenceNode.java:51) - Resolved : pound.location -> brokenhibe0_.location_id
2006-03-22 15:18:18,176 DEBUG [null main] tree.DotNode (DotNode.java:541) - getDataType() : name -> org.hibernate.type.StringType@ea3932
2006-03-22 15:18:18,176 DEBUG [null main] tree.FromReferenceNode (FromReferenceNode.java:51) - Resolved : pound.location.name -> brokenhibe3_.name
2006-03-22 15:18:18,177 DEBUG [null main] tree.FromReferenceNode (FromReferenceNode.java:51) - Resolved : cat -> brokenhibe2_.id
2006-03-22 15:18:18,178 DEBUG [null main] tree.DotNode (DotNode.java:541) - getDataType() : meanness -> org.hibernate.type.IntegerType@170ec24
2006-03-22 15:18:18,180 DEBUG [null main] tree.FromReferenceNode (FromReferenceNode.java:51) - Resolved : cat.meanness -> brokenhibe2_2_.meanness
2006-03-22 15:18:18,180 DEBUG [null main] antlr.HqlSqlBaseWalker (HqlSqlBaseWalker.java:117) - select : finishing up [level=1, statement=select]
2006-03-22 15:18:18,181 DEBUG [null main] ast.HqlSqlWalker (HqlSqlWalker.java:511) - processQuery() : ( SELECT ( {select clause} ( brokenhibe3_.state ( brokenhibe0_.location_id brokenhibe0_.id location ) state ) ) ( FromClause{level=1} ( pound brokenhibe0_ pound_cat brokenhibe2_ city brokenhibe3_ ) ) ( where ( and ( = ( brokenhibe3_.name ( brokenhibe0_.location_id brokenhibe0_.id location ) name ) 'Anytown' ) ( > ( brokenhibe2_2_.meanness brokenhibe2_.id meanness ) 5 ) ) ) )
2006-03-22 15:18:18,186 DEBUG [null main] util.SyntheticAndFactory (SyntheticAndFactory.java:58) - Using WHERE fragment [brokenhibe0_.location_id=brokenhibe3_.id]
2006-03-22 15:18:18,186 DEBUG [null main] util.JoinProcessor (JoinProcessor.java:128) - Using FROM fragment [inner join pound_cat cats1_ on brokenhibe0_.id=cats1_.pound_id inner join cat brokenhibe2_ on cats1_.cats_id=brokenhibe2_.id]
2006-03-22 15:18:18,187 DEBUG [null main] util.JoinProcessor (JoinProcessor.java:128) - Using FROM fragment [pound brokenhibe0_]
2006-03-22 15:18:18,187 DEBUG [null main] antlr.HqlSqlBaseWalker (HqlSqlBaseWalker.java:123) - select >> end [level=1, statement=select]
2006-03-22 15:18:18,193 DEBUG [null main] ast.QueryTranslatorImpl (QueryTranslatorImpl.java:222) - --- SQL AST ---
\-[SELECT] QueryNode: 'SELECT' querySpaces (pound_cat,pound,cat,city)
+-[SELECT_CLAUSE] SelectClause: '{select clause}'
| +-[DOT] DotNode: 'brokenhibe3_.state' {propertyName=state,dereferenceType=4,propertyPath=state,path=pound.location.state,tableAlias=brokenhibe3_,className=com.i2rd.occasio.test.BrokenHibernateDowncast$City,classAlias=null}
| | +-[DOT] DotNode: 'brokenhibe0_.location_id' {propertyName=location,dereferenceType=1,propertyPath=location,path=pound.location,tableAlias=brokenhibe3_,className=com.i2rd.occasio.test.BrokenHibernateDowncast$City,classAlias=null}
| | | +-[ALIAS_REF] IdentNode: 'brokenhibe0_.id' {alias=pound, className=com.i2rd.occasio.test.BrokenHibernateDowncast$Pound, tableAlias=brokenhibe0_}
| | | \-[IDENT] IdentNode: 'location' {originalText=location}
| | \-[IDENT] IdentNode: 'state' {originalText=state}
| \-[SELECT_COLUMNS] SqlNode: ' as col_0_0_'
+-[FROM] FromClause: 'from' FromClause{level=1, fromElementCounter=3, fromElements=3, fromElementByClassAlias=[pound, cat, null], fromElementByTableAlias=[brokenhibe3_, brokenhibe0_, brokenhibe2_], fromElementsByPath=[pound.cats, pound.location], collectionJoinFromElementsByPath=[], impliedElements=[]}
| \-[FROM_FRAGMENT] FromElement: 'pound brokenhibe0_' FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=pound,role=null,tableName=pound,tableAlias=brokenhibe0_,origin=null,colums={,className=com.i2rd.occasio.test.BrokenHibernateDowncast$Pound}}
| +-[JOIN_FRAGMENT] FromElement: 'inner join pound_cat cats1_ on brokenhibe0_.id=cats1_.pound_id inner join cat brokenhibe2_ on cats1_.cats_id=brokenhibe2_.id' FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=cat,role=com.i2rd.occasio.test.BrokenHibernateDowncast$Pound.cats,tableName=cat,tableAlias=brokenhibe2_,origin=pound brokenhibe0_,colums={brokenhibe0_.id ,className=com.i2rd.occasio.test.BrokenHibernateDowncast$Cat}}
| \-[FROM_FRAGMENT] ImpliedFromElement: 'city brokenhibe3_' ImpliedFromElement{implied,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=null,role=null,tableName=city,tableAlias=brokenhibe3_,origin=pound brokenhibe0_,colums={brokenhibe0_.location_id ,className=com.i2rd.occasio.test.BrokenHibernateDowncast$City}}
\-[WHERE] SqlNode: 'where'
+-[THETA_JOINS] SqlNode: '{theta joins}'
| \-[SQL_TOKEN] SqlFragment: 'brokenhibe0_.location_id=brokenhibe3_.id'
\-[AND] SqlNode: 'and'
+-[EQ] BinaryLogicOperatorNode: '='
| +-[DOT] DotNode: 'brokenhibe3_.name' {propertyName=name,dereferenceType=4,propertyPath=name,path=pound.location.name,tableAlias=brokenhibe3_,className=com.i2rd.occasio.test.BrokenHibernateDowncast$City,classAlias=null}
| | +-[DOT] DotNode: 'brokenhibe0_.location_id' {propertyName=location,dereferenceType=1,propertyPath=location,path=pound.location,tableAlias=brokenhibe3_,className=com.i2rd.occasio.test.BrokenHibernateDowncast$City,classAlias=null}
| | | +-[ALIAS_REF] IdentNode: 'brokenhibe0_.id' {alias=pound, className=com.i2rd.occasio.test.BrokenHibernateDowncast$Pound, tableAlias=brokenhibe0_}
| | | \-[IDENT] IdentNode: 'location' {originalText=location}
| | \-[IDENT] IdentNode: 'name' {originalText=name}
| \-[QUOTED_STRING] LiteralNode: ''Anytown''
\-[GT] BinaryLogicOperatorNode: '>'
+-[DOT] DotNode: 'brokenhibe2_2_.meanness' {propertyName=meanness,dereferenceType=4,propertyPath=meanness,path=cat.meanness,tableAlias=brokenhibe2_,className=com.i2rd.occasio.test.BrokenHibernateDowncast$Cat,classAlias=cat}
| +-[ALIAS_REF] IdentNode: 'brokenhibe2_.id' {alias=cat, className=com.i2rd.occasio.test.BrokenHibernateDowncast$Cat, tableAlias=brokenhibe2_}
| \-[IDENT] IdentNode: 'meanness' {originalText=meanness}
\-[NUM_INT] LiteralNode: '5'
2006-03-22 15:18:18,197 DEBUG [null main] ast.ErrorCounter (ErrorCounter.java:68) - throwQueryException() : no errors
2006-03-22 15:18:18,198 DEBUG [null main] ast.QueryTranslatorImpl (QueryTranslatorImpl.java:206) - HQL: select pound.location.state from com.i2rd.occasio.test.BrokenHibernateDowncast$Pound as pound inner join pound.cats as cat where pound.location.name='Anytown' and cat.meanness > 5
2006-03-22 15:18:18,198 DEBUG [null main] ast.QueryTranslatorImpl (QueryTranslatorImpl.java:207) - SQL: select brokenhibe3_.state as col_0_0_ from pound brokenhibe0_ inner join pound_cat cats1_ on brokenhibe0_.id=cats1_.pound_id inner join cat brokenhibe2_ on cats1_.cats_id=brokenhibe2_.id, city brokenhibe3_ where brokenhibe0_.location_id=brokenhibe3_.id and brokenhibe3_.name='Anytown' and brokenhibe2_2_.meanness>5
2006-03-22 15:18:18,199 DEBUG [null main] ast.ErrorCounter (ErrorCounter.java:68) - throwQueryException() : no errors
2006-03-22 15:18:18,200 DEBUG [null main] query.HQLQueryPlan (HQLQueryPlan.java:219) - HQL param location recognition took 0 mills (select pound.location.state from com.i2rd.occasio.test.BrokenHibernateDowncast$Pound as pound inner join pound.cats as cat where pound.location.name='Anytown' and cat.meanness > 5)
2006-03-22 15:18:18,201 DEBUG [null main] query.QueryPlanCache (QueryPlanCache.java:75) - located HQL query plan in cache (select pound.location.state from com.i2rd.occasio.test.BrokenHibernateDowncast$Pound as pound inner join pound.cats as cat where pound.location.name='Anytown' and cat.meanness > 5)
2006-03-22 15:18:18,202 DEBUG [null main] def.AbstractFlushingEventListener (AbstractFlushingEventListener.java:58) - flushing session
2006-03-22 15:18:18,202 DEBUG [null main] def.AbstractFlushingEventListener (AbstractFlushingEventListener.java:111) - processing flush-time cascades
2006-03-22 15:18:18,202 DEBUG [null main] def.AbstractFlushingEventListener (AbstractFlushingEventListener.java:153) - dirty checking collections
2006-03-22 15:18:18,203 DEBUG [null main] def.AbstractFlushingEventListener (AbstractFlushingEventListener.java:170) - Flushing entities and processing referenced collections
2006-03-22 15:18:18,204 DEBUG [null main] engine.Collections (Collections.java:176) - Collection found: [com.i2rd.occasio.test.BrokenHibernateDowncast$Pound.cats#1], was: [com.i2rd.occasio.test.BrokenHibernateDowncast$Pound.cats#1] (initialized)
2006-03-22 15:18:18,204 DEBUG [null main] engine.Collections (Collections.java:176) - Collection found: [com.i2rd.occasio.test.BrokenHibernateDowncast$Pound.dogs#1], was: [com.i2rd.occasio.test.BrokenHibernateDowncast$Pound.dogs#1] (initialized)
2006-03-22 15:18:18,205 DEBUG [null main] def.AbstractFlushingEventListener (AbstractFlushingEventListener.java:209) - Processing unreferenced collections
2006-03-22 15:18:18,206 DEBUG [null main] def.AbstractFlushingEventListener (AbstractFlushingEventListener.java:223) - Scheduling collection removes/(re)creates/updates
2006-03-22 15:18:18,207 DEBUG [null main] def.AbstractFlushingEventListener (AbstractFlushingEventListener.java:85) - Flushed: 0 insertions, 0 updates, 0 deletions to 6 objects
2006-03-22 15:18:18,207 DEBUG [null main] def.AbstractFlushingEventListener (AbstractFlushingEventListener.java:91) - Flushed: 0 (re)creations, 0 updates, 0 removals to 2 collections
2006-03-22 15:18:18,208 DEBUG [null main] pretty.Printer (Printer.java:83) - listing entities:
2006-03-22 15:18:18,209 DEBUG [null main] pretty.Printer (Printer.java:90) - com.i2rd.occasio.test.BrokenHibernateDowncast$Pound{cats=[com.i2rd.occasio.test.BrokenHibernateDowncast$Cat#2, com.i2rd.occasio.test.BrokenHibernateDowncast$Cat#1], dogs=[com.i2rd.occasio.test.BrokenHibernateDowncast$Dog#2, com.i2rd.occasio.test.BrokenHibernateDowncast$Dog#1], location=com.i2rd.occasio.test.BrokenHibernateDowncast$City#1, id=1}
2006-03-22 15:18:18,209 DEBUG [null main] pretty.Printer (Printer.java:90) - com.i2rd.occasio.test.BrokenHibernateDowncast$LargeDog{largeness=100, name=max, id=2}
2006-03-22 15:18:18,210 DEBUG [null main] pretty.Printer (Printer.java:90) - com.i2rd.occasio.test.BrokenHibernateDowncast$DomesticCat{region=Midwest USA, name=charley, id=1}
2006-03-22 15:18:18,210 DEBUG [null main] pretty.Printer (Printer.java:90) - com.i2rd.occasio.test.BrokenHibernateDowncast$Bobcat{meanness=10, name=bobby, id=2}
2006-03-22 15:18:18,211 DEBUG [null main] pretty.Printer (Printer.java:90) - com.i2rd.occasio.test.BrokenHibernateDowncast$ToyDog{tinyness=1, name=fifi, id=1}
2006-03-22 15:18:18,211 DEBUG [null main] pretty.Printer (Printer.java:90) - com.i2rd.occasio.test.BrokenHibernateDowncast$City{state=NE, name=Anytown, id=1}
2006-03-22 15:18:18,211 DEBUG [null main] def.DefaultAutoFlushEventListener (DefaultAutoFlushEventListener.java:53) - Dont need to execute flush
2006-03-22 15:18:18,212 DEBUG [null main] query.HQLQueryPlan (HQLQueryPlan.java:148) - find: select pound.location.state from com.i2rd.occasio.test.BrokenHibernateDowncast$Pound as pound inner join pound.cats as cat where pound.location.name='Anytown' and cat.meanness > 5
2006-03-22 15:18:18,212 DEBUG [null main] engine.QueryParameters (QueryParameters.java:262) - named parameters: {}
2006-03-22 15:18:18,212 DEBUG [null main] jdbc.AbstractBatcher (AbstractBatcher.java:311) - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
2006-03-22 15:18:18,214 DEBUG [null main] jdbc.AbstractBatcher (AbstractBatcher.java:346) -
select
brokenhibe3_.state as col_0_0_
from
pound brokenhibe0_
inner join
pound_cat cats1_
on brokenhibe0_.id=cats1_.pound_id
inner join
cat brokenhibe2_
on cats1_.cats_id=brokenhibe2_.id,
city brokenhibe3_
where
brokenhibe0_.location_id=brokenhibe3_.id
and brokenhibe3_.name='Anytown'
and brokenhibe2_2_.meanness>5
Hibernate:
select
brokenhibe3_.state as col_0_0_
from
pound brokenhibe0_
inner join
pound_cat cats1_
on brokenhibe0_.id=cats1_.pound_id
inner join
cat brokenhibe2_
on cats1_.cats_id=brokenhibe2_.id,
city brokenhibe3_
where
brokenhibe0_.location_id=brokenhibe3_.id
and brokenhibe3_.name='Anytown'
and brokenhibe2_2_.meanness>5
2006-03-22 15:18:18,215 DEBUG [null main] jdbc.AbstractBatcher (AbstractBatcher.java:424) - preparing statement
2006-03-22 15:18:18,237 DEBUG [null main] jdbc.AbstractBatcher (AbstractBatcher.java:319) - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
2006-03-22 15:18:18,239 DEBUG [null main] jdbc.AbstractBatcher (AbstractBatcher.java:470) - closing statement
2006-03-22 15:18:18,252 DEBUG [null main] util.JDBCExceptionReporter (JDBCExceptionReporter.java:63) - could not execute query [select brokenhibe3_.state as col_0_0_ from pound brokenhibe0_ inner join pound_cat cats1_ on brokenhibe0_.id=cats1_.pound_id inner join cat brokenhibe2_ on cats1_.cats_id=brokenhibe2_.id, city brokenhibe3_ where brokenhibe0_.location_id=brokenhibe3_.id and brokenhibe3_.name='Anytown' and brokenhibe2_2_.meanness>5]
org.postgresql.util.PSQLException: ERROR: missing FROM-clause entry for table "brokenhibe2_2_"
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1512)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1297)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:188)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:437)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:353)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:257)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:139)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1669)
at org.hibernate.loader.Loader.doQuery(Loader.java:662)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2145)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
at org.hibernate.loader.Loader.list(Loader.java:2024)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
at com.i2rd.occasio.test.BrokenHibernateDowncast.main(BrokenHibernateDowncast.java:181)
2006-03-22 15:18:18,253 WARN [null main] util.JDBCExceptionReporter (JDBCExceptionReporter.java:71) - SQL Error: 0, SQLState: 42P01
2006-03-22 15:18:18,254 ERROR [null main] util.JDBCExceptionReporter (JDBCExceptionReporter.java:72) - ERROR: missing FROM-clause entry for table "brokenhibe2_2_"
2006-03-22 15:18:18,255 DEBUG [null main] jdbc.JDBCContext (JDBCContext.java:217) - after autocommit
2006-03-22 15:18:18,255 DEBUG [null main] jdbc.ConnectionManager (ConnectionManager.java:296) - transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources!
Exception in thread "main" 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:2148)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
at org.hibernate.loader.Loader.list(Loader.java:2024)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
at com.i2rd.occasio.test.BrokenHibernateDowncast.main(BrokenHibernateDowncast.java:181)
Caused by: org.postgresql.util.PSQLException: ERROR: missing FROM-clause entry for table "brokenhibe2_2_"
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1512)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1297)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:188)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:437)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:353)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:257)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:139)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1669)
at org.hibernate.loader.Loader.doQuery(Loader.java:662)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2145)
... 8 more
Code: