[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-5743) Criteria isMember() creates broken SQL in joined queries

David Momper (JIRA) noreply at atlassian.com
Fri Nov 19 17:17:13 EST 2010


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-5743?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=39176#action_39176 ] 

David Momper commented on HHH-5743:
-----------------------------------

The join is somehow causing this problem. This modified criteria query is created and executed correctly:
{quote}
groupQuery.where(cb.and(
    				//cb.like(gRoot.get(Group_.groupLeader)
    				//		.get(Person_.personName), "%John%"),
    				cb.isMember(c2,
        					gRoot.get(Group_.groupLeader)
        					.get(Person_.validVisas)
        					)
        			));
{quote}

The following SQL is generated:
{quote}
    select
        group0_.GROUP_ID as GROUP1_2_,
        group0_.LEADER_ID as LEADER3_2_,
        group0_.GROUP_NAME as GROUP2_2_ 
    from
        GROUPS group0_ 
    where
        ? in (
            select
                country3_.COUNTRY_CODE 
            from
                PERSON person1_,
                PERSON_COUNTRY_VISA validvisas2_,
                COUNTRY country3_ 
            where
                group0_.LEADER_ID=person1_.PERSON_ID 
                and person1_.PERSON_ID=validvisas2_.PERSON_ID 
                and validvisas2_.COUNTRY_CODE=country3_.COUNTRY_CODE
        )
{quote}

> Criteria isMember() creates broken SQL in joined queries
> --------------------------------------------------------
>
>                 Key: HHH-5743
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-5743
>             Project: Hibernate Core
>          Issue Type: Bug
>          Components: entity-manager
>    Affects Versions: 3.6.0, 3.6.1
>         Environment: Hibernate 3.6.0,3.6.1, all databases
>            Reporter: David Momper
>            Priority: Critical
>         Attachments: Test.zip
>
>
> This problem occurred both when using Oracle, or Derby. I assume it occurs for all databases. I also ran my test case with EclipseLink, and the test passed.
> A criteria query like this:
> {quote}
> CriteriaQuery<Group> groupQuery = cb.createQuery(Group.class);
> Root<Group> gRoot = groupQuery.from(Group.class);
> //Get all groups whose leader's name is John, and has a valid visa for given country
> groupQuery.where(cb.and(
> 		cb.like(gRoot.get(Group_.groupLeader)
> 				.get(Person_.personName), "%John%"),
> 		cb.isMember(country,
> 				gRoot.get(Group_.groupLeader)
> 				.get(Person_.validVisas)
> 				)
> 		));
> {quote}
> produces the following query:
> {quote}
>     select
>         group0_.GROUP_ID as GROUP1_2_,
>         group0_.LEADER_ID as LEADER3_2_,
>         group0_.GROUP_NAME as GROUP2_2_ 
>     from
>         GROUPS group0_,
>         PERSON person1_ 
>     where
>         group0_.LEADER_ID=person1_.PERSON_ID 
>         and (
>             person1_.PERSON_NAME like ?
>         ) 
>         and (
>             ? in (
>                 select
>                     person1_.PERSON_ID 
>                 from
>                     PERSON person1_
>             )
>         )
> {quote}
> The query fails because a (character) country code is being checked for inclusion in a subquery of (int) person ids.
> The subselect in the above query should be on a country, not a person. I think the whole query should look like this:
> {quote}
> select
>     group0_.GROUP_ID as GROUP1_2_,
>     group0_.LEADER_ID as LEADER3_2_,
>     group0_.GROUP_NAME as GROUP2_2_ 
> from
>     GROUPS group0_,
>     PERSON person1_ 
> where
>     group0_.LEADER_ID=person1_.PERSON_ID 
>     and (
>         person1_.PERSON_NAME like ?
>     ) 
>     and (
>         ? in (
>             select
>                 country3_.COUNTRY_CODE 
>             from
>                 PERSON person1_,
>                 PERSON_COUNTRY_VISA validvisas2_,
>                 COUNTRY country3_ 
>             where
>                 group0_.LEADER_ID=person1_.PERSON_ID 
>                 and person1_.PERSON_ID=validvisas2_.PERSON_ID 
>                 and validvisas2_.COUNTRY_CODE=country3_.COUNTRY_CODE
>         )
>     )
> {quote}

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