[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-2101) Can't use outer join in table with composite-id, key-many-to-one

Hugo Zhu (JIRA) noreply at atlassian.com
Sun Sep 24 16:17:24 EDT 2006


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-2101?page=comments#action_24604 ] 

Hugo Zhu commented on HHH-2101:
-------------------------------

Just found "select this from BlogUserUrl this inner join fetch this.url where this.blog=?" is a much better way.

Hugo

> Can't use outer join in table with composite-id, key-many-to-one
> ----------------------------------------------------------------
>
>          Key: HHH-2101
>          URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2101
>      Project: Hibernate3
>         Type: Improvement

>   Components: core
>     Versions: 3.1.3
>  Environment: MYSQL: 5.0.15-nt-log
> mysql-connector-java-3.0.16-ga
> Hibernate 3.1.3
>     Reporter: Hugo Zhu

>
>
> MYSQL 5 database;
> HBM like below: 
>   <class name="Blog" table="blog" dynamic-update="true">
>         <id column="id" name="id" type="long">
>             <generator class="native"/>
>         </id>
>         ...
>   </class>
>   <class name="BlogUrl" table="blog_url" dynamic-update="true">
>         <id column="id" name="id" type="long">
>             <generator class="native"/>
>         </id>
>         <property name="url" type="string" length="255" not-null="true"/>
>         <property name="urlHash" type="string" length="32" unique="true" not-null="true"/>
>         <property name="numOfHits" type="integer"/>
>         <property name="created" type="timestamp"/>
>     </class>
>     <class name="BlogUserUrl" table="blog_user_url" dynamic-update="true">
>         <composite-id>
>             <key-many-to-one name="url" class="BlogUrl"/>
>             <key-many-to-one name="blog" class="Blog"/>
>         </composite-id>
>         <property name="title" type="string" length="255" not-null="true"/>
>         <property name="description" type="string" length="255"/>
>         <property name="created" type="timestamp"/>
>     </class>
> But:
> getSession().createCriteria(BlogUserUrl.class).setFetchMode("url",FetchMode.JOIN).add(Restrictions.eq("blog", blog).setMaxResults(25).list();
> Still generates 2 queries - query 1: query out BlogUserUrl, then query 2: possible 25 sub queries for earch BlogUrl
> The better way should be just 1 outer join.
> I have set: <property name="max_fetch_depth">1</property> in Hibernate configuration, but there is no join attribute in element: key-many-to-one.
> The only way to solve this issue I can find out is:
> HQL: select this,this.url from BlogUserUrl this where this.blog=?, but I have to add a loop in results to conver the Object[] list to BlogUserUrl only  list. Not ideal
> Thanks for looking into this issue.
> Hugo

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