Author: ppoddar
Date: Thu Mar 18 04:38:57 2010
New Revision: 924633

URL: http://svn.apache.org/viewvc?rev=924633&view=rev
Log:
Better error message for multi-valued object path traversal

Modified:
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/AbstractExpressionBuilder.java
    
openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/jpql/localizer.properties

Modified: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/AbstractExpressionBuilder.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/AbstractExpressionBuilder.java?rev=924633&r1=924632&r2=924633&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/AbstractExpressionBuilder.java
 (original)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/AbstractExpressionBuilder.java
 Thu Mar 18 04:38:57 2010
@@ -288,6 +288,9 @@ public abstract class AbstractExpression
         if (fmd == null) {
             Object val = traverseStaticField(meta.getDescribedType(), field);
             if (val == null) {
+                if (isMultiValuedTraversalAttempt(path, field)) {
+                    throw parseException(EX_USER, "multi-valued-travesal", new 
Object[]{field, path.last()}, null);
+                }
                String[] all = meta.getFieldNames();
                Class<?> cls = meta.getDescribedType();
                 throw parseException(EX_USER, "no-field",
@@ -333,6 +336,15 @@ public abstract class AbstractExpression
             return null;
         }
     }
+    
+    private boolean isMultiValuedTraversalAttempt(Path path, String field) {
+        if (path == null) return false;
+        if (path.last() == null) return false;
+        if (path.last().getElement() == null) return false;
+        if (path.last().getElement().getDeclaredTypeMetaData() == null) return 
false;
+        if (path.last().getElement().getDeclaredTypeMetaData().getField(field) 
== null) return false;
+        return true;
+    }
 
     /**
      * Returns the type of the named variable if it has been declared.

Modified: 
openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/jpql/localizer.properties
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/jpql/localizer.properties?rev=924633&r1=924632&r2=924633&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/jpql/localizer.properties
 (original)
+++ 
openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/jpql/localizer.properties
 Thu Mar 18 04:38:57 2010
@@ -30,6 +30,9 @@ cant-resolve-type: The entity "{0}" cann
 not-identifer: The specified node ("{0}") is not a valid identifier.
 no-field: No field named "{0}" in "{1}". Did you mean "{2}"? Expected one of \
        the available field names in "{3}": "{4}".
+multi-valued-travesal: Attempt to navigate to relation field "{0}" via 
multi-valued \
+       association "{1}". JPQL does not allow traversal through multi-valued \
+       relation path. Try join instead.        
 unaccessible-field: The field named "{1}" in class "{0}" could not be accessed.
 multi-children: Expression "{0}" does not allow multiple children ("{1}").
 no-children: Expression "{0}" requires at least one child.


Reply via email to