[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-2739) 'illegal attempt to dereference collection' when referencing a single-valued association in an implicit join

Yoon Kyung Koo (JIRA) noreply at atlassian.com
Sun Dec 9 02:19:57 EST 2007


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-2739?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_29116 ] 

Yoon Kyung Koo commented on HHH-2739:
-------------------------------------

I found this is a duplication of 2667. I resolved the problem by the guide of Nick Folder. Just copying that ...

--- 

Nick Folder - [22/Jul/07 04:00 PM ]
>From the Hibernate 3.2 Migration Guide:

"Query language changes
Implicit joins are more deterministic

With such mapping:

<class name='Currency' lazy='false'>
   ....
</class>

<class name='Asset'>
  <id name='id' ... </id>
  <many-to-one name='currency' class='Currency' fetch='select'/>
</class>

and such HQL query:

select a.id, a.currency from Asset a

Since Hibernate 3.2.2 this query generates an inner join on Asset with Currency which means that Assets with a NULL currency are not returned by the query anymore.

This makes implicit joins more deterministic.

To get Assets with a NULL currency just use

select a.id, c from Asset a left join a.currency as c

Path expressions joining across a collection throw exception

The always illegal statement:

select f.bars.baz from Foo f

Now throws an exception. Despite the always present warning in the documentation that this is an illegal path expression if bars is a collection, users found this to be working in some cases with Hibernate 3.1. This is no longer the case, an error is thrown. As always, the correct syntax is an explicit join:

select b.baz from Foo f join f.bars b" 

> 'illegal attempt to dereference collection' when referencing a single-valued association in an implicit join
> ------------------------------------------------------------------------------------------------------------
>
>                 Key: HHH-2739
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2739
>             Project: Hibernate3
>          Issue Type: Bug
>    Affects Versions: 3.2.3, 3.2.4, 3.2.4.sp1
>         Environment: I have found that behaviour in version 3.2.4.sp1 and 3.2.3 (I didn't test 3.2.4 pre sp1)
> Database: ORACLE 10g
>            Reporter: Martin Kouba
>            Assignee: Steve Ebersole
>
> After upgrading to the latest Hibernate version I got this error.
> I try to use a statement like this
> from cat c where c.mate.id = 13
> the expected resulting SQL should be something like
> SELECT * FROM CAT C WHERE C.MATE_ID = 13
> which is much more performant than making a join
> from cat c join c.mate m where m.id = 13
> which would result in something like that
> SELECT * FROM CAT C INNER JOIN MATE M ON C.MATE_ID = M.ID WHERE M.ID = 13
> This works as expected in 3.1.3, 3.2.0 and 3.2.2
> It doesn't work with version 3.2.3 and with 3.2.4.sp1.
> As test case you can take the example from the documentation chapter 5.1.16
> <?xml version="1.0"?>
> <!DOCTYPE hibernate-mapping PUBLIC
>         "-//Hibernate/Hibernate Mapping DTD//EN"
>         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
> <hibernate-mapping package="eg">
>         <class name="Cat" table="CATS">
>                 <id name="id" column="uid" type="long">
>                         <generator class="hilo"/>
>                 </id>
>                 <property name="birthdate" type="date"/>
>                 <property name="color" not-null="true"/>
>                 <property name="sex" not-null="true"/>
>                 <property name="weight"/>
>                 <many-to-one name="mate"/>
>                 <set name="kittens">
>                         <key column="MOTHER"/>
>                         <one-to-many class="Cat"/>
>                 </set>
>                 <joined-subclass name="DomesticCat" table="DOMESTIC_CATS">
>                     <key column="CAT"/>
>                     <property name="name" type="string"/>
>                 </joined-subclass>
>         </class>
>         <class name="eg.Dog">
>                 <!-- mapping for Dog could go here -->
>         </class>
> </hibernate-mapping>
> c = new Cat();
> c.setMate(new Cat());
> c.persist();
> int id = c.getId();
> List results = session.createQuery("from Cat as c where c.mate.id = 16).list();
> according to manual section 14.5 this should work
> http://www.hibernate.org/hib_docs/v3/reference/en/html_single/#queryhql-identifier-property
> Ok, I hope this is clear enough and the test case is clear enough as well.
> This is a major stopper for an upgrade. I have reported that on June 11th
> http://opensource.atlassian.com/projects/hibernate/browse/HHH-2667
> But it seems that others used the same case to report a similar issue regarding automatic joins.
> According to Christian Bauer automatic joins are no longer supported, closed the case and told me to reopen it again.
> So to all others please do not add comments to this case if it is not about it. And to the Hibernate developers: Greate work you are doing but please I think the issue was clear when I reported it the first time. It is quite easy to reproduce and occurs quite often in a medium size project.
> Gratitude
> Martin

-- 
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