You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2010/03/18 05:38:58 UTC
svn commit: r924633 - in /openjpa/trunk/openjpa-kernel/src/main:
java/org/apache/openjpa/kernel/exps/AbstractExpressionBuilder.java
resources/org/apache/openjpa/kernel/jpql/localizer.properties
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.