Hello,
I encounter a StackOverflowError while running a simple selection. I'll
try to explain as clearly as possible the context where the bug occurs:
Here are my objects:
A is persisted entity.
A has a name field.
A contains a tree structure of B.
B is a persisted entity.
B may have a B parent and may have B children.
B has a name field.
B has a path field which is build by collapsing all the parent names.
Here is an example (syntax used: instanceName = className{attributeName:
attributeValue, attributeName: attributeValue, ...};) :
A = A{name: "A"};
rootB = B{parentA: A, name: rootB};
B1 = {parentA: A, name: "B1", parentB: rootB, path: "B1"};
B11 = {parentA: A, name: "B11", parentB: B1, path: "B1.B11"};
B12 = {parentA: A, name: "B12", parentB: B1, path: "B1.B12"};
B111 = {parentA: A, name: "B11", parentB: B11, path: "B1.B11.B111"};
Here is the query that I run:
SELECT DISTINCT b from B b1, B b2 WHERE (LOCATE(b2.path, b1.path) = 1 OR
b1.path = b2.path) AND (b2.name LIKE :arg1) AND (b1.parentA IN (SELECT
DISTINCT a from A a WHERE a.name LIKE :arg2)) AND (b2.parentA IN (SELECT
DISTINCT a from A a WHERE a.name LIKE :arg2))
Here is the stacktrace:
java.lang.StackOverflowError
at
org.apache.openjpa.jdbc.sql.SelectImpl.aliasSize(SelectImpl.java:2132)
at
org.apache.openjpa.jdbc.sql.SelectImpl.aliasSize(SelectImpl.java:2140)
at
org.apache.openjpa.jdbc.sql.SelectImpl.aliasSize(SelectImpl.java:2132)
at
org.apache.openjpa.jdbc.sql.SelectImpl.aliasSize(SelectImpl.java:2140)
at
org.apache.openjpa.jdbc.sql.SelectImpl.aliasSize(SelectImpl.java:2132)
at
org.apache.openjpa.jdbc.sql.SelectImpl.aliasSize(SelectImpl.java:2140)
at ...
Here is the method into the JPA sources where the loop occurs:
2128: /**
2129: * Calculate total number of aliases.
2130: */
2131: private int aliasSize(SelectImpl fromSub) {
2132: int aliases = (_parent == null) ? 0
2133: : _parent.aliasSize(this);
2134: aliases += (_aliases == null) ? 0 : _aliases.size();
2135: if (_subsels != null) {
2136: SelectImpl sub;
2137: for (int i = 0; i < _subsels.size(); i++) {
2138: sub = (SelectImpl) _subsels.get(i);
2139: if (sub != fromSub)
2140: aliases += sub.aliasSize(null);
2141: }
2142: }
2143: return aliases;
2144: }
The problem seems to occur when multiple subqueries are present.
If I remove the second IN clause, the problem does not occur.
I also suspect the problem occurs when multiple subqueries select the
same object. I may be wrong, though.
Any help is welcomed.
Thanks.
--
Lionel Savouillan