[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-4085) Specifying a select clause triggers the "query specified join fetching, but the owner..." exception
Gail Badner (JIRA)
noreply at atlassian.com
Thu Aug 26 15:02:41 EDT 2010
[ http://opensource.atlassian.com/projects/hibernate/browse/HHH-4085?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=38210#action_38210 ]
Gail Badner commented on HHH-4085:
----------------------------------
I am also seeing this using a Criteria:
<code>
s.createCriteria( Student.class, "s" )
.createAlias( "s.preferredCourse", "pc", Criteria.LEFT_JOIN )
.setFetchMode( "enrolments", FetchMode.JOIN )
.list();
</code>
> Specifying a select clause triggers the "query specified join fetching, but the owner..." exception
> ---------------------------------------------------------------------------------------------------
>
> Key: HHH-4085
> URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-4085
> Project: Hibernate Core
> Issue Type: Bug
> Components: query-hql
> Affects Versions: 3.3.2
> Environment: Kubuntu 9.04
> Reporter: Kent Tong
>
> An Order contains some OrderItem's. Each OrderItem contains a Product and a quantity. To retrieve the Orders, The following HQL works:
> Code:
> from Order o left join fetch o.items i join fetch i.product
> However, if I specify the select clause:
> Code:
> select o from Order o left join fetch o.items i join fetch i.product
> Then Hibernate will return an error:
> Code:
> Exception in thread "main" org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=null,role=null,tableName=Product,tableAlias=product2_,origin=items items1_,colums={items1_.p_id ,className=lab3.Product}}] [select o from lab3.Order o left join fetch o.items i join fetch i.product]
> at org.hibernate.hql.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:217)
> at org.hibernate.hql.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:727)
> at org.hibernate.hql.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:551)
> at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:645)
> at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
> at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
> at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:251)
> at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183)
> at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:134)
> at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
> at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
> at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:94)
> at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
> at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
> at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1650)
> 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.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:342)
> at $Proxy0.createQuery(Unknown Source)
> at lab3.OnlineStoreApp.run(OnlineStoreApp.java:32)
> at lab3.OnlineStoreApp.main(OnlineStoreApp.java:14)
> The test code is shown below:
> Code:
> package lab3;
> import java.util.List;
> import org.hibernate.Session;
> import org.hibernate.SessionFactory;
> import org.hibernate.cfg.Configuration;
> public class OnlineStoreApp {
> private SessionFactory factory;
> private Session session;
> public static void main(String[] args) {
> new OnlineStoreApp().run();
> }
> public OnlineStoreApp() {
> Configuration cfg = new Configuration();
> cfg.configure();
> factory = cfg.buildSessionFactory();
> }
> @SuppressWarnings("unchecked")
> private void run() {
> session = factory.getCurrentSession();
> session.beginTransaction();
> Order o = new Order();
> o.getItems().add(new OrderItem(new Product("p1"), 10));
> o.getItems().add(new OrderItem(new Product("p2"), 20));
> session.save(o);
> List<Order> orders = session
> .createQuery(
> "select o from Order o left join fetch o.items i join fetch i.product")
> .list();
> System.out.println(orders.size());
> session.getTransaction().commit();
> }
> }
> package lab3;
> import java.util.ArrayList;
> import java.util.List;
> public class Order {
> private Long internalId;
> private List<OrderItem> items;
> public Order() {
> items = new ArrayList<OrderItem>();
> }
> public Long getInternalId() {
> return internalId;
> }
> public void setInternalId(Long internalId) {
> this.internalId = internalId;
> }
> public List<OrderItem> getItems() {
> return items;
> }
> public void setItems(List<OrderItem> items) {
> this.items = items;
> }
> }
> package lab3;
> public class OrderItem {
> private Product product;
> private int qty;
> public OrderItem() {
> }
> public OrderItem(Product product, int qty) {
> this();
> this.product = product;
> this.qty = qty;
> }
> public Product getProduct() {
> return product;
> }
> public void setProduct(Product product) {
> this.product = product;
> }
> public int getQty() {
> return qty;
> }
> public void setQty(int qty) {
> this.qty = qty;
> }
> }
> package lab3;
> public class Product {
> private Long internalId;
> private String name;
> public Product() {
> }
> public Product(String name) {
> this();
> this.name = name;
> }
> public Long getInternalId() {
> return internalId;
> }
> public void setInternalId(Long internalId) {
> this.internalId = internalId;
> }
> public String getName() {
> return name;
> }
> public void setName(String name) {
> this.name = name;
> }
> }
> <?xml version="1.0"?>
> <!DOCTYPE hibernate-configuration PUBLIC
> "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
> "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
> <hibernate-configuration>
> <session-factory>
> <property name="hibernate.connection.url">jdbc:h2:tcp://localhost/~/test</property>
> <property name="hibernate.connection.driver_class">org.h2.Driver</property>
> <property name="hibernate.connection.username">sa</property>
> <property name="hibernate.connection.password"></property>
> <property name="hibernate.hbm2ddl.auto">update</property>
> <property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
> <property name="hibernate.current_session_context_class">thread</property>
> <property name="hibernate.show_sql">false</property>
> <mapping resource="Product.hbm.xml"/>
> <mapping resource="Order.hbm.xml"/>
> </session-factory>
> </hibernate-configuration>
> <?xml version="1.0"?>
> <!DOCTYPE hibernate-mapping PUBLIC
> "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
> "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
> <hibernate-mapping>
> <class name="lab3.Order" table="orders">
> <id name="internalId">
> <generator class="sequence"></generator>
> </id>
> <list name="items" cascade="save-update">
> <key column="o_id"></key>
> <list-index column="idx"></list-index>
> <composite-element class="lab3.OrderItem">
> <many-to-one name="product" column="p_id" cascade="save-update"></many-to-one>
> <property name="qty"></property>
> </composite-element>
> </list>
> </class>
> </hibernate-mapping>
> <?xml version="1.0"?>
> <!DOCTYPE hibernate-mapping PUBLIC
> "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
> "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
> <hibernate-mapping>
> <class name="lab3.Product">
> <id name="internalId">
> <generator class="sequence"></generator>
> </id>
> <property name="name"></property>
> </class>
> </hibernate-mapping>
--
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