[ 
https://issues.apache.org/jira/browse/OPENJPA-2149?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Aviram Segal updated OPENJPA-2149:
----------------------------------

    Description: 
Criteria.function will generate an SQL with only the last parameter casted and 
to the wrong type.
                Expression<String> stPointFunc = cb.function(
                                "db2gse.st_point", 
                                String.class,
                                cb.literal(0.0),
                                cb.literal(0.0),
                                cb.literal(1003));
                
                Expression<Double> distanceFunc = cb.function(
                                "db2gse.st_distance", 
                                Double.class, 
                                stPointFunc, 
                                usersLocations.get("location"));
                
                
criteriaQuery.select(usersLocations).where(cb.lessThan(distanceFunc, 
cb.literal(50.0)));

Will generate the following SQL:
(db2gse.st_distance(db2gse.st_point(?, ?, CAST(? AS DOUBLE)), t0.LOCATION) < ?)

Notice the 3rd parameter is an Integer and its being cast as Double.
The problem is in org.apache.openjpa.jdbc.kernel.exps.DatastoreFunction#appendTo

Line 54:  args.appendTo(sel, ctx, state, sql, 0);
Will append 3 ? to the sql buffer: "(db2gse.st_distance(db2gse.st_point(?, ?, ?"

Then the loop in line 56-58
            for (int i = 1; i < vals.length; i++) {
                sql.addCastForParam(getOperator(), vals[i]);
            }
It becomes: "(db2gse.st_distance(db2gse.st_point(?, ?, CAST(? AS DOUBLE)"


Starts with 1 (second parameter and not the first one), whil 
sql.addCastForParam only works for the last ? in the sql buffer, meaning the 
cast for the param at index 1 is added to the last ? and the method will not do 
anything else.

This issue leaves Criteria.function useless to me, I tried extending my 
DBDictionary to remove all the cast as a work around but the function became 
ambiguous.

Thanks in advance.



  was:
Criteria.function will generate an SQL with only the last parameter casted and 
to the wrong type.
                Expression<String> stPointFunc = cb.function(
                                "db2gse.st_point", 
                                String.class,
                                cb.literal(0.0),
                                cb.literal(0.0),
                                cb.literal(1003));
                
                Expression<Double> distanceFunc = cb.function(
                                "db2gse.st_distance", 
                                Double.class, 
                                stPointFunc, 
                                usersLocations.get("location"));
                
                
criteriaQuery.select(usersLocations).where(cb.lessThan(distanceFunc, 
cb.literal(50.0)));

Will generate the following SQL:
(db2gse.st_distance(db2gse.st_point(?, ?, CAST(? AS DOUBLE)), t0.LOCATION) < ?)
Notice the 3rd parameter is an Integer and its being cast as Double.
The problem is in org.apache.openjpa.jdbc.kernel.exps.DatastoreFunction#appendTo

Line 54:  args.appendTo(sel, ctx, state, sql, 0);
Will append 3 ? to the sql buffer "(db2gse.st_distance(db2gse.st_point(?, ?, ?"
Then the loop in line 56-58
            for (int i = 1; i < vals.length; i++) {
                sql.addCastForParam(getOperator(), vals[i]);
            }

Starts with 1 (second parameter and not the first one), whil 
sql.addCastForParam only works for the last ? in the sql buffer, meaning the 
cast for the param at index 1 is added to the last ? and the method will not do 
anything else.

This issue leaves Criteria.function useless to me, I tried extending my 
DBDictionary to remove all the cast as a work around but the function became 
ambiguous.

Thanks in advance.




    
> Criteria.function adds wrong casts to parameters making it unsuable
> -------------------------------------------------------------------
>
>                 Key: OPENJPA-2149
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-2149
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: criteria, kernel
>    Affects Versions: 2.0.1, 2.0.2, 2.1.1
>         Environment: Standalone 2.0.0 and 2.0.1 downloaded from openjpa 
> website, and on WebSphere 7 JPA2 feature pack 1.0.0.5 (contains OpenJPA 2.0.2)
>            Reporter: Aviram Segal
>            Priority: Critical
>
> Criteria.function will generate an SQL with only the last parameter casted 
> and to the wrong type.
>               Expression<String> stPointFunc = cb.function(
>                               "db2gse.st_point", 
>                               String.class,
>                               cb.literal(0.0),
>                               cb.literal(0.0),
>                               cb.literal(1003));
>               
>               Expression<Double> distanceFunc = cb.function(
>                               "db2gse.st_distance", 
>                               Double.class, 
>                               stPointFunc, 
>                               usersLocations.get("location"));
>               
>               
> criteriaQuery.select(usersLocations).where(cb.lessThan(distanceFunc, 
> cb.literal(50.0)));
> Will generate the following SQL:
> (db2gse.st_distance(db2gse.st_point(?, ?, CAST(? AS DOUBLE)), t0.LOCATION) < 
> ?)
> Notice the 3rd parameter is an Integer and its being cast as Double.
> The problem is in 
> org.apache.openjpa.jdbc.kernel.exps.DatastoreFunction#appendTo
> Line 54:  args.appendTo(sel, ctx, state, sql, 0);
> Will append 3 ? to the sql buffer: "(db2gse.st_distance(db2gse.st_point(?, ?, 
> ?"
> Then the loop in line 56-58
>             for (int i = 1; i < vals.length; i++) {
>                 sql.addCastForParam(getOperator(), vals[i]);
>             }
> It becomes: "(db2gse.st_distance(db2gse.st_point(?, ?, CAST(? AS DOUBLE)"
> Starts with 1 (second parameter and not the first one), whil 
> sql.addCastForParam only works for the last ? in the sql buffer, meaning the 
> cast for the param at index 1 is added to the last ? and the method will not 
> do anything else.
> This issue leaves Criteria.function useless to me, I tried extending my 
> DBDictionary to remove all the cast as a work around but the function became 
> ambiguous.
> Thanks in advance.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to