Skip to content

StackoverFlow error when querying for multiple records using OR clause #721

@sureshpendap

Description

@sureshpendap

I am invoking this method with 2000 keys, basically I would like to retrieve 2000 records matching these alternate keys using a AK_COL = :key1 OR AK_COL=key2.....
etc
AlternateKeyValue is an abstraction which encapsulates the fieldNames comprising my Alternate key and their values.

public Collection<QueryBase> query(Collection<AlternateKeyValue> akKeys)
{
    System.out.println("Constructing Query: " + akKeys.size());
    BooleanExpression[] allFieldsMatch = new BooleanExpression[akKeys.size()];

    int aKeyIndex = 0;
    for (AlternateKeyValue aKey : akKeys)
    {
        Set<String> fields = aKey.getFieldNames();
        BooleanExpression[] expressions = new BooleanExpression[fields.size()];

        //Alternate Key can be composite, loop through all the fields
        //and create an equality expression predicate for each field
        int fieldIndex = 0;
        for (String fieldName : fields)
        {

            Object fieldValue = aKey.getFieldValue(fieldName);

            Path<Object> fieldExpr = Expressions.path(Object.class, queryClass, fieldName);
            expressions[fieldIndex++] = Expressions.predicate(Ops.EQ, fieldExpr, Expressions.constant(fieldValue));
        }
        System.out.println("Constructing Expression for : " + aKeyIndex);
        //We need an Entity for which all the fields of a Alternate key match
        allFieldsMatch[aKeyIndex++] = BooleanExpression.allOf(expressions);
    }

    System.out.println("End of LOOP");

    //We need to get all the Entries in bulk using the OR clause
    Predicate anyOfExpr = BooleanExpression.anyOf(allFieldsMatch);

    System.out.println("/-----------***********AFTER  ANYOF..........");
    System.out.println("/-----------***********CHANGES_TAKING EFFECT-----------****************/////");
    QueryBase bulkGetQuery = new JPAQuery(null , JPQLTemplates.DEFAULT)
                                .from(this.queryClass)
                                .where (anyOfExpr);  // For very large values like 5000 this constructor itself throws a Stackoverflow error
    bulkGetQuery.list(this.queryClass);  //This throws a StackOverFlow exception
}   

The Stackoverflow error exception

java.lang.StackOverflowError
at java.lang.Integer.rotateLeft(Integer.java:1128)
at com.google.common.collect.Hashing.smear(Hashing.java:47)
at com.google.common.collect.RegularImmutableSet.contains(RegularImmutableSet.java:49)
at com.mysema.query.jpa.JPQLSerializer.visitOperation(JPQLSerializer.java:393)
at com.mysema.query.support.SerializerBase.visit(SerializerBase.java:246)
at com.mysema.query.support.SerializerBase.visit(SerializerBase.java:42)
at com.mysema.query.types.OperationImpl.accept(OperationImpl.java:91)
at com.mysema.query.support.SerializerBase.handle(SerializerBase.java:102)
at com.mysema.query.support.SerializerBase.visitOperation(SerializerBase.java:277)
at com.mysema.query.jpa.JPQLSerializer.visitOperation(JPQLSerializer.java:397)
at com.mysema.query.support.SerializerBase.visit(SerializerBase.java:246)
at com.mysema.query.support.SerializerBase.visit(SerializerBase.java:42)
at com.mysema.query.types.OperationImpl.accept(OperationImpl.java:91)
at com.mysema.query.support.SerializerBase.handle(SerializerBase.java:102)
at com.mysema.query.support.SerializerBase.visitOperation(SerializerBase.java:277)
at com.mysema.query.jpa.JPQLSerializer.visitOperation(JPQLSerializer.java:397)
at com.mysema.query.support.SerializerBase.visit(SerializerBase.java:246)
at com.mysema.query.support.SerializerBase.visit(SerializerBase.java:42)
at com.mysema.query.types.OperationImpl.accept(OperationImpl.java:91)
at com.mysema.query.support.SerializerBase.handle(SerializerBase.java:102)
at com.mysema.query.support.SerializerBase.visitOperation(SerializerBase.java:277)
at com.mysema.query.jpa.JPQLSerializer.visitOperation(JPQLSerializer.java:397)
at com.mysema.query.support.SerializerBase.visit(SerializerBase.java:246)
at com.mysema.query.support.SerializerBase.visit(SerializerBase.java:42)
at com.mysema.query.types.OperationImpl.accept(OperationImpl.java:91)
at com.mysema.query.support.SerializerBase.handle(SerializerBase.java:102)
at com.mysema.query.support.SerializerBase.visitOperation(SerializerBase.java:277)
at com.mysema.query.jpa.JPQLSerializer.visitOperation(JPQLSerializer.java:397)
at com.mysema.query.support.SerializerBase.visit(SerializerBase.java:246)
at com.mysema.query.support.SerializerBase.visit(SerializerBase.java:42)
at com.mysema.query.types.OperationImpl.accept(OperationImpl.java:91)
at com.mysema.query.support.SerializerBase.handle(SerializerBase.java:102)
at com.mysema.query.support.SerializerBase.visitOperation(SerializerBase.java:277)
at com.mysema.query.jpa.JPQLSerializer.visitOperation(JPQLSerializer.java:397)
at com.mysema.query.support.SerializerBase.visit(SerializerBase.java:246)
at com.mysema.query.support.SerializerBase.visit(SerializerBase.java:42)
at com.mysema.query.types.OperationImpl.accept(OperationImpl.java:91)
at com.mysema.query.support.SerializerBase.handle(SerializerBase.java:102)
at com.mysema.query.support.SerializerBase.visitOperation(SerializerBase.java:277)
at com.mysema.query.jpa.JPQLSerializer.visitOperation(JPQLSerializer.java:397)
at com.mysema.query.support.SerializerBase.visit(SerializerBase.java:246)
at com.mysema.query.support.SerializerBase.visit(SerializerBase.java:42)
at com.mysema.query.types.OperationImpl.accept(OperationImpl.java:91)
at com.mysema.query.support.SerializerBase.handle(SerializerBase.java:102)
at com.mysema.query.support.SerializerBase.visitOperation(SerializerBase.java:277)
at com.mysema.query.jpa.JPQLSerializer.visitOperation(JPQLSerializer.java:397)
at com.mysema.query.support.SerializerBase.visit(SerializerBase.java:246)
at com.mysema.query.support.SerializerBase.visit(SerializerBase.java:42)
at com.mysema.query.types.OperationImpl.accept(OperationImpl.java:91)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions