[hibernate-issues] [Hibernate-JIRA] Updated: (HHH-2776) Restrictons.in(..) generates invalid SQL if list of values is empty

Steve Ebersole (JIRA) noreply at atlassian.com
Mon Feb 2 15:08:39 EST 2009


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

Steve Ebersole updated HHH-2776:
--------------------------------

       Assignee: Steve Ebersole
    Component/s: query-hql
     Issue Type: New Feature  (was: Bug)

Couple of points:
1) Actually the SQL spec says that "... in () ..." is not valid; there must be at least one value present in the in-value-list.  However, my reading of the spec (SQL-92) is that NULL is not allowed to be an in-value-list item either.  SQL-2008 does allow NULLs in an explicit in-value-list, so somewhere in between that changed.  That leaves a conundrum...
2) If we were to use "... in (NULL) ...", the spec says that NULL == NULL is undefined and should never return true.  So comparison for a NULL value in a value list should therefore never return true.  So we'd be safe to my thinking

Regardless, this is not a bug to my mind but a feature request.  The only question here is who has responsibility to make sure there is at least one value in the in-value-list.  The request is to make Hibernate responsible for this.

> Restrictons.in(..) generates invalid SQL if list of values is empty
> -------------------------------------------------------------------
>
>                 Key: HHH-2776
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2776
>             Project: Hibernate Core
>          Issue Type: New Feature
>          Components: query-criteria, query-hql
>    Affects Versions: 3.2.2
>         Environment: Hibernate 3.2.2.ga, MySQL 4.1.18, Windows XP
>            Reporter: Adrian Smith
>            Assignee: Steve Ebersole
>
> I have classes called A and B. There is a 1:n relationship from A to B.
> Class B has the following in its mapping file:
>    <many-to-one name="a" class="A" column="fk_a_id" not-null="true" />
> If I write the following code:
>     List<B> foo() {
>        List<A> aList = ....
>        Session session = ....
>        Criteria query = session.createCriteria(B.class);
>        query.add(Restrictions.in("a", aList));
>        return query.list();
>    }
> Then all works fine and the results I want are returned. However, if aList is empty (i.e. aList.size()==0) then the query.list function generates and executes invalid SQL for MySQL.
> java.sql.SQLException: Syntax error or access violation message from server: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1"
> I imagine that it is generating SQL like IN () which isn't valid.
> I realize it's a bit ridiculous to want to find the rows where a field is IN the empty list. Nothing will ever be returned. However, in my opinion it should still be allowed, and return no rows, just as saying "WHERE 1=2" is allowed, just doesn't return any rows.

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