I dug into the jpql implementation of openjpa, and at the
org.apache.openjpa.jdbc.kernel.exps.PCPath, line 465,

    public Class getType() {
        if (_cast != null)
            return _cast;
        Action act = lastFieldAction();
        if (act != null && act.op == Action.GET_XPATH)
            return ((XMLMetaData) act.data).getType();

        FieldMetaData fld = (act == null) ? null : (FieldMetaData) act.data;
        boolean key = act != null && act.op == Action.GET_KEY;
        if (fld != null) {
            switch (fld.getDeclaredTypeCode()) {
                case JavaTypes.ARRAY:
                    if (fld.getDeclaredType() == byte[].class
                        || fld.getDeclaredType() == Byte[].class
                        || fld.getDeclaredType() == char[].class
                        || fld.getDeclaredType() == Character[].class)
                        return fld.getDeclaredType();
                    return fld.getElement().getDeclaredType();
                case JavaTypes.MAP:
                    if (key)
                        return fld.getKey().getDeclaredType();
                    return fld.getElement().getDeclaredType();
                case JavaTypes.COLLECTION:
                    return fld.getElement().getDeclaredType();
                default:
                    return fld.getDeclaredType();
            }
        }
        if (_class != null)
            return _class.getDescribedType();
        return Object.class;
    }


In the above method, it will always return the element type of a array
if it is not a byte/char array. I feel so sad for this limit
and that I can not use a array field as a query condition. Is there
any work around to bypass this limit? Or I have to maintain
a patch for this?

2012/11/16 xzer <xiao...@gmail.com>:
> Well, it works for query and update now.
>
>         col.setJavaType(JavaSQLTypes.SQL_ARRAY);
>         col.setType(JavaSQLTypes.SQL_ARRAY);
>
> declare the field as @Lob and set col type in the handler as above
> will work well.
>
> but there is still a problem, I can not use the field as a query condition:
>
> Caused by: java.lang.IllegalArgumentException: Parameter
> "Parameter<long>(2)" declared in "select c from WatchCondition c where
> c._targetType = ?1 and c._testIdList = ?2" is set to value of
> "[J@3dc016fe" of type "[J", but this parameter is bound to a field of
> type "long".
>         at 
> org.apache.openjpa.persistence.AbstractQuery.assertValueAssignable(AbstractQuery.java:616)
> ~[openjpa-2.2.0.jar:2.2.0]
>         at 
> org.apache.openjpa.persistence.AbstractQuery.bindValue(AbstractQuery.java:558)
> ~[openjpa-2.2.0.jar:2.2.0]
>         at 
> org.apache.openjpa.persistence.AbstractQuery.setParameter(AbstractQuery.java:140)
> ~[openjpa-2.2.0.jar:2.2.0]
>         at 
> org.apache.openjpa.persistence.AbstractQuery.setParameter(AbstractQuery.java:46)
> ~[openjpa-2.2.0.jar:2.2.0]
>
> 2012/11/16 xzer <xiao...@gmail.com>:
>> @PersistentCollection does not work for me, it always gives a message
>> as "the_field_as_array isn't supported by declared persistence
>> strategy "Basic".  Please choose a different strategy."
>>
>> I follow the description in the jira ticket to declare the field as
>> @Lob, it works for query, but still not work for update.
>>
>> In the jira ticket, it says I should provide an extended
>> PostgresDictionary, how to tell openjpa to use my extended
>> PostgresDictionary?
>>
>> 2012/11/15 Krzysztof <yaz...@gmail.com>:
>>> Use your own strategy:
>>>
>>> @PersistentCollection
>>> @Strategy("gaia.cu7.om.dal.dictionary.PostgresArrayHandler")
>>> private double[] timeDecay;
>>>
>>> Example for float8[] below, change toDataStoreValue to deal with
>>> Long/bigint.
>>> PostgresArrayHandler.java
>>> <http://openjpa.208410.n2.nabble.com/file/n7581766/PostgresArrayHandler.java>
>>>
>>> Cheers
>>>
>>>
>>>
>>> --
>>> View this message in context: 
>>> http://openjpa.208410.n2.nabble.com/how-to-deal-with-jdbc4-sql-array-tp7581756p7581766.html
>>> Sent from the OpenJPA Users mailing list archive at Nabble.com.

Reply via email to