Class JPQLSingleStringParser

  • public class JPQLSingleStringParser
    extends Object
    Parser for handling JPQL Single-String queries. Takes a JPQLQuery and the query string and parses it into its constituent parts, updating the JPQLQuery accordingly with the result that, after calling the parse() method, the JPQLQuery is populated.
     SELECT [{result} ]
            [FROM {from-clause} ]
            [WHERE {filter}]
            [GROUP BY {grouping-clause} ]
            [HAVING {having-clause} ]
            [ORDER BY {ordering-clause}]
            [RANGE x,y]
     e.g SELECT c FROM Customer c INNER JOIN c.orders o WHERE c.status = 1
     UPDATE {update-clause}
     WHERE {filter}
    and update-clause is of the form "Entity [[AS] identifier] SET {field = new_value}, ..." or
     DELETE {delete-clause}
     WHERE {filter}
    and delete-clause is of the form "FROM Entity [[AS] identifier]"

    Note that only the {filter} and {having-clause} can strictly contain subqueries in JPQL, hence containing keywords

     SELECT c FROM Customer c WHERE NOT EXISTS (SELECT o1 FROM c.orders o1)
    So the "filter" for the outer query is "NOT EXISTS (SELECT o1 FROM c.orders o1)". Note also that we allow subqueries in {result}, {from}, and {having} clauses as well (vendor extension). If a subquery is contained we extract the subquery and then set it as a variable in the symbol table, and add the subquery separately. Note that the
    [RANGE x,y]
    is a DataNucleus extension syntax to allow for specification of firstResult/maxResults in the query string and hence in subqueries and is dependent on enabling datanucleus.query.jpql.allowRange. TODO Need to better cater for the construct "TRIM(... FROM ...)" since it reuses the FROM keyword and we don't handle that explicitly here, just working around it
    • Constructor Detail

      • JPQLSingleStringParser

        public JPQLSingleStringParser​(Query query,
                                      String queryString)
        Constructor for the Single-String parser.
        query - The query into which we populate the components of the query
        queryString - The Single-String query
    • Method Detail

      • parse

        public void parse()
        Method to parse the Single-String query