|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||
java.lang.Objectorg.hdpagination.dataaccess.support.QueryBuilder
org.hdpagination.dataaccess.support.orm.JPAQueryCallbackNamedParamWrapper
public class JPAQueryCallbackNamedParamWrapper
This class is used as a convenient wrapper class for JPAQueryCallback.
It simplifies the way to generate an instance of JPAQueryCallback based on the searching criteria fields.
Typically, there are two types of query parameters binding in the JP QL (Java Persistence Query Language) Queries. One is positioned parameter (JDBC-style ? parameters) and
another one is named parameter. This wrapper class is used for named parameter type. If you prefer positioned parameter (JDBC-style ? parameters) type,
JPAQueryCallbackWrapper should be used.
The way to use JPAQueryCallbackNamedParamWrapper usually follows the following steps:
(1) Call its static factory method getInstance to get an initial instance of JPAQueryCallbackNamedParamWrapper.
(2) Call addRestriction methods from the instance.
(3) Call setOrderBy method if you want to sort the search result.
A sample code is as follows:
JPAQueryCallbackNamedParamWrapper callback = JPAQueryCallbackNamedParamWrapper.newInstance("select p from ProductVO p", "p")
.addRestriction( NamedParamRestrictions.eq("p.prodNo", "propNo", crit.getProdNo()) )
.addRestriction( NamedParamRestrictions.contains("p.description", "desc", crit.getDescription()) )
.addRestriction( NamedParamRestrictions.ge("p.price", "priceFrom", priceFrom) )
.addRestriction( NamedParamRestrictions.le("p.price", "priceTo", priceTo) )
.setOrderBy("p.madeIn");
Behind the scene, the way JPAQueryCallbackNamedParamWrapper generates the full query statement can be described as:
'selectFrom' (the first argument from static factory methods newInstance) to construct an initial query statement.addRestriction). For each restriction: (1) It appends the keyword 'WHERE' or 'AND' to the query statement first.
If it is the first restriction, 'WHERE' is added; otherwise 'AND' is added.
(2) Then it appends the restriction's clause statement (e.g. p.description LIKE :desc) to the query statement.
orderBy is set, then append the generated ORDER BY clause to the query statement.
| Field Summary |
|---|
| Fields inherited from class org.hdpagination.dataaccess.support.QueryBuilder |
|---|
asending, countStatement, orderBy, selectFrom |
| Constructor Summary | |
|---|---|
JPAQueryCallbackNamedParamWrapper(java.lang.String selectFrom,
java.lang.String countArgument)
Please note that the factory method newInstance(java.lang.String, java.lang.String) is encouraged to use to create an object of
JPAQueryCallbackNamedParamWrapper rather than instantiating it directly. |
|
| Method Summary | |
|---|---|
JPAQueryCallbackNamedParamWrapper |
addRestriction(NamedParamRestriction restriction)
Add restriction applied to the query SELECT statement. |
JPAQueryCallbackNamedParamWrapper |
addRestriction(java.lang.String clause)
Add restriction applied to the query SELECT statement. |
JPAQueryCallbackNamedParamWrapper |
addRestriction(java.lang.String clause,
NamedParams params)
Add restriction applied to the query SELECT statement. |
JPAQueryCallbackNamedParamWrapper |
addRestriction(java.lang.String clause,
java.lang.String paramName,
java.lang.Object paramValue)
Add restriction applied to the query SELECT statement. |
java.lang.String |
getCountRecordsQueryStatement()
Query statement to count total records. |
java.lang.String |
getQueryStatement()
Generate the full query statement |
static JPAQueryCallbackNamedParamWrapper |
newInstance(java.lang.String selectFrom,
java.lang.String countArgument)
As a convenient (or shortcut) factory method to get an initial JPAQueryCallbackNamedParamWrapper object. |
java.util.List |
processQueriedResult(java.util.List queriedResult)
process the result from calling javax.persistence.Query.list() method
in JPAQueryTemplate.query(QueryCallback callback, int pageSize, int pageNo),
and the value(java.util.List) returned by current method will be used as the return value of
JPAQueryTemplate.query(QueryCallback callback, int pageSize, int pageNo). |
JPAQueryCallbackNamedParamWrapper |
setOrderBy(java.lang.String orderBy)
Set order by |
JPAQueryCallbackNamedParamWrapper |
setOrderBy(java.lang.String orderBy,
boolean ascending)
Set order by |
void |
setQueryResultProcessor(QueryResultProcessor queryResultProcessor)
Set an instance of QueryResultProcessor to process the query result (java.util.List)
before EntityManager is closed. |
void |
setValues(javax.persistence.Query query)
Operate on Query instance to bind parameters |
| Methods inherited from class org.hdpagination.dataaccess.support.QueryBuilder |
|---|
getQueryOrder, setCountRecordsQueryStatement, setQueryOrder |
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Methods inherited from interface org.hdpagination.core.QueryCallback |
|---|
getQueryOrder, setQueryOrder |
| Constructor Detail |
|---|
public JPAQueryCallbackNamedParamWrapper(java.lang.String selectFrom,
java.lang.String countArgument)
Please note that the factory method newInstance(java.lang.String, java.lang.String) is encouraged to use to create an object of
JPAQueryCallbackNamedParamWrapper rather than instantiating it directly.
selectFrom - the "SELECT ... FROM .." statement for the JP QL (Java Persistence Query Language) query. It should not contain the
"WHERE" clause, otherwise when restrictions are added later, the full generated query statement will not be correct
(it contains more than one "WHERE" key words). The methods addRestriction are used to specify the "WHERE" clause.
It also should not contain the "ORDER BY" clause, the method setOrderBy is for this purpose.countArgument - to query the total number of records, the "SELECT COUNT([countArgument]) FROM ..."
statement (generated based on the query statement) needs to be executed. As specified by JPA Specification, the COUNT function takes either an
identification variable or a path expression as its argument. This argument will be used as the COUNT function's argument.
This argument can not be null or empty, unless the property countRecordsQueryStatement is set explicitly by calling the method
JPAQueryCallbackNamedParamWrapper.setCountRecordsQueryStatement(java.lang.String)
(in this case, it will be ignored).| Method Detail |
|---|
public JPAQueryCallbackNamedParamWrapper setOrderBy(java.lang.String orderBy)
orderBy - the column after the key word ORDER BY in 'ORDER BY' clause
public JPAQueryCallbackNamedParamWrapper setOrderBy(java.lang.String orderBy,
boolean ascending)
orderBy - the column after the key word ORDER BY in 'ORDER BY' clauseascending - if sorted in ascending order
public void setQueryResultProcessor(QueryResultProcessor queryResultProcessor)
QueryResultProcessor to process the query result (java.util.List)
before EntityManager is closed. Its main purpose is to allow you to trigger lazy loading before
EntityManager is closed. See sample code is provided in QueryResultProcessor.
queryResultProcessor - public JPAQueryCallbackNamedParamWrapper addRestriction(NamedParamRestriction restriction)
SELECT statement.
If the argument 'restriction' is not null, the restriction will be appended to the WHERE
clause of the SELECT statement to filter the search result. Otherwise, the restriction will not be appended.
Typically, this method is used together with one of static factory methods from NamedParamRestrictions.
NamedParamRestrictions provides some static factory methods to generate object of NamedParamRestriction conditionally based on parameter value.
The general rule for these static factory methods in NamedParamRestrictions is:
paramValue is null or blank (with type of java.lang.String), it returns null.
As a result,the restriction is not applied.
The benefit of doing this is you can avoid coding the annoying IF .. ELSE checking in your code.
restriction - If the argument is null, the restriction is not applied to the query.
public JPAQueryCallbackNamedParamWrapper addRestriction(java.lang.String clause)
SELECT statement. The restriction will be appended to the WHERE clause of the
SELECT statement to filter the search result.
clause - The WHERE clause fragment (after prefixing "WHERE" or "AND" keywords) will be appended to the
SELECT statement.
Please note that the key words "WHERE" or "AND" should be excluded from this clause fragment. When generating the full query statement,
the framework knows when to prefix "WHERE" or "AND". The clause fragment should NOT contain named parameter.
This argument can not be null or blank.
public JPAQueryCallbackNamedParamWrapper addRestriction(java.lang.String clause,
java.lang.String paramName,
java.lang.Object paramValue)
SELECT statement. The restriction will be appended to the WHERE clause of the
SELECT statement to filter the search result. This method allows single named query parameter.
clause - The WHERE clause fragment (after prefixing "WHERE" or "AND" keywords) will be appended to the
SELECT statement. Please note that the key words "WHERE" and "AND" should be excluded from this clause fragment.
When generating the full query statement, the framework knows when to prefix "WHERE" or "AND".
The clause fragment should only contain ONE and ONLY ONE named query parameter of the form :name and it should match the 'paramName' argument.
For example, if the argument clause is "p.madeIn = :country", then the value of argument paramName should be "country".
This argument can not be null or blank.paramName - The name of named query parameter. It must match the token value (it is country in above example) inside the clause fragment.
This argument can not be null or blank.paramValue - The value of named query parameter
This argument can not be null.
public JPAQueryCallbackNamedParamWrapper addRestriction(java.lang.String clause,
NamedParams params)
SELECT statement. The restriction will be appended to the WHERE clause of the
SELECT statement to filter the search result. This method allows multiple named query parameters.
clause - The WHERE clause fragment (after prefixing "WHERE" or "AND" keywords) will be appended to
the SELECT statement. Please note that the key words "WHERE" and "AND" should be excluded from this clause fragment.
When generating the full query statement, the framework knows when to prefix "WHERE" or "AND".
The clause fragment can contain multiple named query parameters of the form :name and they should match the names defined in the argument params.
For example, if the argument clause is "p.price BETWEEN :priceFrom and :priceTo"", the named parameters with name as priceFrom
and priceTo should be included in the argument params.
This argument can not be null or blank.params - An object defining the mapping of named query parameters (key:parameter name, value:parameter value).
NamedParamsList, a default implementation of
NamedParams, can be used to add multiple named parameters.
This argument can not be null.
public void setValues(javax.persistence.Query query)
JPAQueryCallbackQuery instance to bind parameters
setValues in interface JPAQueryCallbackpublic java.lang.String getQueryStatement()
getQueryStatement in interface QueryCallbackpublic java.lang.String getCountRecordsQueryStatement()
QueryBuilderQueryTemplate will do some auto translation to generate the "count query statement"
based on "queryStatement" property and related persistence technology or database provides (e.g.
the way of translation is different between Hibernate and JDBC, Oracle and DB2).
getCountRecordsQueryStatement in interface QueryCallbackgetCountRecordsQueryStatement in class QueryBuilderpublic java.util.List processQueriedResult(java.util.List queriedResult)
JPAQueryCallbackjavax.persistence.Query.list() method
in JPAQueryTemplate.query(QueryCallback callback, int pageSize, int pageNo),
and the value(java.util.List) returned by current method will be used as the return value of
JPAQueryTemplate.query(QueryCallback callback, int pageSize, int pageNo).
processQueriedResult in interface JPAQueryCallback
public static JPAQueryCallbackNamedParamWrapper newInstance(java.lang.String selectFrom,
java.lang.String countArgument)
JPAQueryCallbackNamedParamWrapper object.
This factory method is encouraged to create an object of JPAQueryCallbackNamedParamWrapper rather than instantiating it directly.
Please note, since version 1.3.2, this method adds a second argument countArgument to fix a design defect not complying with the JPA specification.
So if you upgrade from previous version (1.3.1), you will find a compilation error.
selectFrom - the "SELECT ... FROM .." or "FROM ..." statement for the query. Ideally, it should not contain the
"WHERE" clause, otherwise when restrictions are added later, the full generated query statement will not be correct
(it contains more than one "WHERE" key words). The methods addRestriction are used to specify the "WHERE" clause.
It also should not contain the "ORDER BY" clause, the method setOrderBy is for this purpose.
This argument can not be null or empty.countArgument - to query the total number of records, the "SELECT COUNT([countArgument]) FROM ..."
statement (generated based on the query statement) needs to be executed. As specified by JPA Specification, the COUNT function takes either an
identification variable or a path expression as its argument. This argument will be used as the COUNT function's argument.
This argument can not be null or empty, unless the property countRecordsQueryStatement is set explicitly by calling the method
JPAQueryCallbackNamedParamWrapper.setCountRecordsQueryStatement(java.lang.String)
(in this case, it will be ignored).
|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||