[hibernate-issues] [Hibernate-JIRA] Updated: (HHH-3374) Subselect fetching fetches all elements in link table instead only needed

Alexander V. Zinin (JIRA) noreply at atlassian.com
Mon Jul 7 18:39:38 EDT 2008


     [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-3374?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Alexander V. Zinin updated HHH-3374:
------------------------------------

    Attachment: hibernate_bug.rar

Also available here: http://zinin.ru/share/hibernate_bug.rar



> Subselect fetching fetches all elements in link table instead only needed
> -------------------------------------------------------------------------
>
>                 Key: HHH-3374
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-3374
>             Project: Hibernate3
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 3.2.6
>            Reporter: Alexander V. Zinin
>         Attachments: hibernate_bug.rar
>
>
> I've some entity with many-to-many collection inside. Example:
> public class Message implements Serializable {
>     @ManyToMany(fetch = FetchType.LAZY)
>     @JoinTable(name = "message_has_file_attachment", joinColumns = {@JoinColumn(name = "message_id")},
>             inverseJoinColumns = {@JoinColumn(name = "file_attachment_id")})
>     @Fetch(value = FetchMode.SUBSELECT)
>     public Set<MessageImageFileAttachment> getFileAttachments() {
>         return fileAttachments;
>     }
> }
> I want to fetch this collection for items I've fetched. I do:
>         DetachedCriteria criteria = DetachedCriteria.forClass(messageClass);
>                 criteria.setFetchMode("fileAttachments", FetchMode.SELECT);
>                 List list = getHibernateTemplate().findByCriteria(criteria, firstResult, maxResults);
>                 if (list.size() > 0) {
>                     Message message = (Message) list.get(0);
>                     Hibernate.initialize(message.getFileAttachments());
>                 }
> And hibernate generates subquery like this:
> select
>         fileattach0_.message_id as message1_1_,
>         fileattach0_.file_attachment_id as file2_1_,
>         messageima1_.id as id12_0_,
>         messageima1_.creationDate as creation3_12_0_,
>         messageima1_.hostname as hostname12_0_,
>         messageima1_.name as name12_0_,
>         messageima1_.path as path12_0_,
>         messageima1_.submited as submited12_0_,
>         messageima1_.description as descript8_12_0_,
>         messageima1_.hasSmallImage as hasSmall9_12_0_,
>         messageima1_.height as height12_0_,
>         messageima1_.smallHeight as smallHe11_12_0_,
>         messageima1_.smallWidth as smallWidth12_0_,
>         messageima1_.tinyHeight as tinyHeight12_0_,
>         messageima1_.tinyWidth as tinyWidth12_0_,
>         messageima1_.width as width12_0_ 
>     from
>         message_has_file_attachment fileattach0_ 
>     left outer join
>         file_attachment messageima1_ 
>             on fileattach0_.file_attachment_id=messageima1_.id 
>     where
>         fileattach0_.message_id in (
>             select
>                 this_.id 
>             from
>                 message this_ 
>             inner join
>                 a_user user2_ 
>                     on this_.user_id=user2_.id 
>             left outer join
>                 file_attachment articlemes3_ 
>                     on this_.image_id=articlemes3_.id 
>             )
> So it fetched ALL rows in table ! And what happens if there will be a millions rows ?
> http://www.hibernate.org/hib_docs/v3/reference/en/html_single/#performance
> Subselect fetching - a second SELECT  is used to retrieve the associated collections for all entities retrieved in a previous query or fetch. Unless you explicitly disable lazy fetching by specifying lazy="false", this second select will only be executed when you actually access the association.

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