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.