查询HQL日志
parent
491de16d37
commit
5b5d072423
|
|
@ -271,13 +271,9 @@ public class QueryAction extends AbstractAction implements ApplicationContextAwa
|
||||||
|
|
||||||
for (Object key : params.keySet()) {
|
for (Object key : params.keySet()) {
|
||||||
Object param=params.get(key);
|
Object param=params.get(key);
|
||||||
|
|
||||||
String param_str=param.toString();
|
String param_str=param.toString();
|
||||||
//log.info(key.toString()+"====="+param_str+"--"+param_str.indexOf("%"));
|
|
||||||
if(param_str.indexOf("%")==0){
|
if(param_str.indexOf("%")==0){
|
||||||
//log.info("替换开始");
|
params.put(key, param_str.substring(1));
|
||||||
params.put(key, param_str.substring(1));
|
|
||||||
|
|
||||||
log.info("替换------"+key.toString()+"====="+param_str+"--"+param_str.indexOf("%"));
|
log.info("替换------"+key.toString()+"====="+param_str+"--"+param_str.indexOf("%"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -306,14 +302,11 @@ public class QueryAction extends AbstractAction implements ApplicationContextAwa
|
||||||
} else if (tableConfig.getSortHql() != null && !"".equals(tableConfig.getSortHql())) {
|
} else if (tableConfig.getSortHql() != null && !"".equals(tableConfig.getSortHql())) {
|
||||||
hql3 = String.valueOf(hql3.substring(0, index)) + tableConfig.getSortHql() + " ," + hql3.substring(index + 8, hql3.length());
|
hql3 = String.valueOf(hql3.substring(0, index)) + tableConfig.getSortHql() + " ," + hql3.substring(index + 8, hql3.length());
|
||||||
}
|
}
|
||||||
//log.info("------------------------------------------------------------------------------------------------查询方式1------------------------------------------------------------------------------------------------ ");
|
|
||||||
result = buildHqlGrid(tableConfig, hql3, params);
|
result = buildHqlGrid(tableConfig, hql3, params);
|
||||||
} else if (tableConfig.getDataSourceType().equals(DataSource.JAVA_TYPE)) {
|
} else if (tableConfig.getDataSourceType().equals(DataSource.JAVA_TYPE)) {
|
||||||
//log.info("------------------------------------------------------------------------------------------------查询方式2------------------------------------------------------------------------------------------------ ");
|
|
||||||
result = buildJavaGrid(tableConfig, hql3, params);
|
result = buildJavaGrid(tableConfig, hql3, params);
|
||||||
}
|
}
|
||||||
params.clear();
|
params.clear();
|
||||||
// log.info("------------------------------------------------------------------------------------------------查询结束------------------------------------------------------------------------------------------------ ");
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,866 @@
|
||||||
|
package com.dev.energy.server.valuelist.adapter.hib3;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.text.ParseException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
import net.mlw.vlh.DefaultListBackedValueList;
|
||||||
|
import net.mlw.vlh.ValueList;
|
||||||
|
import net.mlw.vlh.ValueListInfo;
|
||||||
|
import net.mlw.vlh.adapter.AbstractValueListAdapter;
|
||||||
|
import net.mlw.vlh.adapter.util.ObjectValidator;
|
||||||
|
|
||||||
|
import org.apache.commons.beanutils.PropertyUtils;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.hibernate.CacheMode;
|
||||||
|
import org.hibernate.HibernateException;
|
||||||
|
import org.hibernate.Query;
|
||||||
|
import org.hibernate.ScrollableResults;
|
||||||
|
import org.hibernate.Session;
|
||||||
|
import org.hibernate.SessionFactory;
|
||||||
|
import org.springframework.orm.hibernate3.SessionFactoryUtils;
|
||||||
|
|
||||||
|
import com.dev.energy.server.model.DomainModel;
|
||||||
|
import com.dev.energy.server.util.HqlCountParserSupport;
|
||||||
|
import com.dev.energy.server.valuelist.adapter.hib3.util.ScrollableResultsDecorator;
|
||||||
|
import com.dev.energy.server.valuelist.adapter.hib3.util.StatementBuilder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This adapter wraps the functionality of Hibernate.
|
||||||
|
* Add extra functionality such as paging, focusing
|
||||||
|
* and validating of current result set.
|
||||||
|
* <i>
|
||||||
|
* "Hibernate is a powerful, ultra-high performance
|
||||||
|
* object/relational persistence and query service
|
||||||
|
* for Java. Hibernate lets you develop persistent
|
||||||
|
* classes following common Java idiom - including
|
||||||
|
* association, inheritance, polymorphism, composition
|
||||||
|
* and the Java collections framework. The Hibernate
|
||||||
|
* Query Language, designed as a "minimal"
|
||||||
|
* object-oriented extension to SQL, provides an
|
||||||
|
* elegant bridge between the object and relational
|
||||||
|
* worlds. Hibernate also allows you to express queries
|
||||||
|
* using native SQL or Java-based Criteria and Example
|
||||||
|
* queries. Hibernate is now the most popular
|
||||||
|
* object/relational mapping solution for Java."
|
||||||
|
* </i> -http://www.hibernate.org/
|
||||||
|
*
|
||||||
|
* @author dev
|
||||||
|
* @version $Revision: 1.1.1.1 $ $Date: 2010/06/29 01:59:03 $
|
||||||
|
*
|
||||||
|
* @note Updated by Olexiy Prokhorenko (olexiy@objecty.com) for Hibernate 3
|
||||||
|
*/
|
||||||
|
public class Hibernate30Adapter extends AbstractValueListAdapter implements ValueListAdapter
|
||||||
|
{
|
||||||
|
/** The Hibernate SessionFactory. */
|
||||||
|
private SessionFactory sessionFactory;
|
||||||
|
private String cacheRegion;
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* If is set, it use special ScrollableResultsDecorator, that enable or
|
||||||
|
* disable to add object in final list.
|
||||||
|
* </p>
|
||||||
|
* <h4>NOTE:</h4>
|
||||||
|
* <p>
|
||||||
|
* Also, it respects the total count of entries that overlap your paged
|
||||||
|
* list.
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
private ObjectValidator _validator = null;
|
||||||
|
|
||||||
|
/** Commons logger. */
|
||||||
|
protected static final Log LOGGER = LogFactory
|
||||||
|
.getLog(Hibernate30Adapter.class);
|
||||||
|
|
||||||
|
/** If a new Session should be created if no thread-bound found. */
|
||||||
|
private boolean allowCreate = true;
|
||||||
|
|
||||||
|
/** The hibernate query. */
|
||||||
|
private String hql;
|
||||||
|
|
||||||
|
private String namedQuery;
|
||||||
|
|
||||||
|
/** The max rows in ResulSet to doFocus
|
||||||
|
* @author dev
|
||||||
|
*/
|
||||||
|
private long maxRowsForFocus = Long.MAX_VALUE;
|
||||||
|
|
||||||
|
/** The name of object use to get focus property in hibernate sql syntax
|
||||||
|
* SELECT defaultFocusPropertyObjectAlias.getFocusProperty ...
|
||||||
|
*
|
||||||
|
* @author dev
|
||||||
|
*/
|
||||||
|
private String defaultFocusPropertyObjectAlias = "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable or Disable String length checking of given filters values. If
|
||||||
|
* filter value is null or empty is removed from query.
|
||||||
|
* @author dev
|
||||||
|
*/
|
||||||
|
private boolean _isRemoveEmptyStrings = false;
|
||||||
|
|
||||||
|
private StatementBuilder statementBuilder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable or disable optimalization of the query for focus property.
|
||||||
|
*/
|
||||||
|
private boolean _focusOptimalization = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the focusOptimalization.
|
||||||
|
*/
|
||||||
|
public boolean isFocusOptimalization()
|
||||||
|
{
|
||||||
|
return _focusOptimalization;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Enable or disable optimalization of the query for focus property.
|
||||||
|
* @param focusOptimalization true - enable query with short select, false - query with full select
|
||||||
|
*/
|
||||||
|
public void setFocusOptimalization(boolean focusOptimalization)
|
||||||
|
{
|
||||||
|
_focusOptimalization = focusOptimalization;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* If is set, it use special ScrollableResultsDecorator, that enable or
|
||||||
|
* disable to add object in final list.
|
||||||
|
* </p>
|
||||||
|
* <h4>NOTE:</h4>
|
||||||
|
* <p>
|
||||||
|
* Also, it respects the total count of entries that overlap your paged
|
||||||
|
* list.
|
||||||
|
* </p>
|
||||||
|
* @param validator The validator to set.
|
||||||
|
*/
|
||||||
|
public void setValidator(ObjectValidator validator)
|
||||||
|
{
|
||||||
|
_validator = validator;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @return Returns the isPrefilterEmpty.
|
||||||
|
*/
|
||||||
|
public boolean isRemoveEmptyStrings()
|
||||||
|
{
|
||||||
|
return _isRemoveEmptyStrings;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Enable or Disable String length checking of given filters values. If
|
||||||
|
* filter value is null or empty is removed from query.
|
||||||
|
*
|
||||||
|
* @param isPrefilterEmpty
|
||||||
|
* true-remove null and empty, false - remove only null filters.
|
||||||
|
*/
|
||||||
|
public void setRemoveEmptyStrings(boolean isPrefilterEmpty)
|
||||||
|
{
|
||||||
|
_isRemoveEmptyStrings = isPrefilterEmpty;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see net.mlw.vlh.ValueListAdapter#getValueList(java.lang.String,
|
||||||
|
* net.mlw.vlh.ValueListInfo)
|
||||||
|
*/
|
||||||
|
public ValueList getValueList(String hql, ValueListInfo info)
|
||||||
|
{
|
||||||
|
if (LOGGER.isDebugEnabled())
|
||||||
|
{
|
||||||
|
LOGGER.debug("getValueList(String, ValueListInfo) - start");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info.getSortingColumn() == null)
|
||||||
|
{
|
||||||
|
info.setPrimarySortColumn(getDefaultSortColumn());
|
||||||
|
info.setPrimarySortDirection(getDefaultSortDirectionInteger());
|
||||||
|
if (LOGGER.isDebugEnabled()) {
|
||||||
|
LOGGER.debug("The default sort column '" + getDefaultSortColumn() + "' with direction '"+getDefaultSortDirectionInteger()+"' was set.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info.getPagingNumberPer() == Integer.MAX_VALUE)
|
||||||
|
{
|
||||||
|
info.setPagingNumberPer(getDefaultNumberPerPage());
|
||||||
|
if (LOGGER.isDebugEnabled()) {
|
||||||
|
LOGGER.debug("The paging number per page '" + getDefaultNumberPerPage() + "' was set.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Session session = SessionFactoryUtils.getSession(getSessionFactory(),allowCreate);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Query query;
|
||||||
|
|
||||||
|
boolean doFocus = ((getAdapterType() & DO_FOCUS) == 0)
|
||||||
|
&& info.isFocusEnabled() && info.isDoFocus()
|
||||||
|
&& (namedQuery == null);
|
||||||
|
|
||||||
|
if (doFocus)
|
||||||
|
{
|
||||||
|
ScrollableResults results = getScrollableResults(getQueryForFocus(info, session), info);
|
||||||
|
results.beforeFirst();
|
||||||
|
doFocusFor(info, results);
|
||||||
|
}
|
||||||
|
if(LOGGER.isDebugEnabled()){
|
||||||
|
LOGGER.debug("Query hql = " + hql);
|
||||||
|
}
|
||||||
|
LOGGER.info("-------------------------------开始内部SQL-----------------------------------");
|
||||||
|
query = getQuery(hql,info, session);
|
||||||
|
if(cacheRegion != null){
|
||||||
|
query.setCacheable(true);
|
||||||
|
query.setCacheRegion(cacheRegion);
|
||||||
|
query.setCacheMode(CacheMode.NORMAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean doPage = ((getAdapterType() & DO_PAGE) == 0);
|
||||||
|
List list;
|
||||||
|
list = new ArrayList(info.getPagingNumberPer());
|
||||||
|
if (doPage)
|
||||||
|
{
|
||||||
|
int numberPerPage = (info.getPagingNumberPer() > 0) ? info.getPagingNumberPer() : getDefaultNumberPerPage();
|
||||||
|
int start = (info.getPagingPage() - 1) * numberPerPage;
|
||||||
|
query.setFirstResult(start);
|
||||||
|
query.setFetchSize(numberPerPage);
|
||||||
|
query.setMaxResults(numberPerPage);
|
||||||
|
Long st_Time=System.currentTimeMillis();
|
||||||
|
List results = query.list();
|
||||||
|
Long ed_Time=System.currentTimeMillis();
|
||||||
|
LOGGER.info("查询数据用时:"+(ed_Time-st_Time));
|
||||||
|
for (int i = 0; i < results.size(); i++)
|
||||||
|
{
|
||||||
|
if(i == results.size()){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Object result = results.get(i);
|
||||||
|
if (result instanceof Object[]) {
|
||||||
|
Object[] objs = (Object[]) result;
|
||||||
|
if(objs.length == 1 && objs[0] instanceof DomainModel){
|
||||||
|
list.add(objs[0]);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
list.add(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(result instanceof DomainModel){
|
||||||
|
list.add(result);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
list.add(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ed_Time=System.currentTimeMillis();
|
||||||
|
LOGGER.info("处理数据用时:"+(ed_Time-st_Time));
|
||||||
|
if (LOGGER.isDebugEnabled())
|
||||||
|
{
|
||||||
|
LOGGER.debug("Sorting finished.");
|
||||||
|
}
|
||||||
|
|
||||||
|
String countHql = HqlCountParserSupport.getCountHql(hql);
|
||||||
|
int si = -1 , j;
|
||||||
|
si = countHql.toLowerCase().lastIndexOf("/~sortcolumn:");
|
||||||
|
if (si > 0) {
|
||||||
|
j = countHql.toLowerCase().indexOf("~/" , si);
|
||||||
|
if (j > 0) {
|
||||||
|
int k = countHql.indexOf(")" , j);
|
||||||
|
if (k < 0) {
|
||||||
|
countHql = countHql.substring(0 , si) + countHql.substring(j + 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
si = countHql.toLowerCase().lastIndexOf("order by");
|
||||||
|
if (si > 0) {
|
||||||
|
int k = countHql.indexOf(")" , si);
|
||||||
|
if (k < 0) {
|
||||||
|
countHql = countHql.substring(0 , si);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
si = countHql.toLowerCase().lastIndexOf("group by");
|
||||||
|
if (si > 0) {
|
||||||
|
int k = countHql.indexOf(")" , si);
|
||||||
|
if (k < 0) {
|
||||||
|
countHql = countHql.substring(0 , si);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(LOGGER.isDebugEnabled()){
|
||||||
|
LOGGER.debug("Count hql = " + countHql);
|
||||||
|
}
|
||||||
|
ed_Time=System.currentTimeMillis();
|
||||||
|
LOGGER.info("生成总条数用时:"+(ed_Time-st_Time));
|
||||||
|
Query countQuery = getStatementBuilder().generate(session, new StringBuffer(countHql), info.getFilters(), _isRemoveEmptyStrings);
|
||||||
|
List result = countQuery.list();
|
||||||
|
ed_Time=System.currentTimeMillis();
|
||||||
|
LOGGER.info("查询总条数用时:"+(ed_Time-st_Time));
|
||||||
|
if (result.size() > 0){
|
||||||
|
int lastRowNumber = Integer.parseInt(result.get(0).toString());//((Integer) result.get(0)).intValue();
|
||||||
|
info.setTotalNumberOfEntries(lastRowNumber);
|
||||||
|
}else{
|
||||||
|
info.setTotalNumberOfEntries(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (LOGGER.isDebugEnabled())
|
||||||
|
{
|
||||||
|
LOGGER.debug("Retrieving a list directly from the query.");
|
||||||
|
}
|
||||||
|
list = query.list();
|
||||||
|
info.setTotalNumberOfEntries(list.size());
|
||||||
|
}
|
||||||
|
ValueList returnValueList = getListBackedValueList(info, list);
|
||||||
|
if (LOGGER.isDebugEnabled())
|
||||||
|
{
|
||||||
|
LOGGER.debug("Retrieved list was wrapped in valuelist, info=" + info);
|
||||||
|
}
|
||||||
|
return returnValueList;
|
||||||
|
}
|
||||||
|
catch (HibernateException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
throw SessionFactoryUtils.convertHibernateAccessException(e);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
//SessionFactoryUtils.closeSessionIfNecessary(session, getSessionFactory());
|
||||||
|
SessionFactoryUtils.releaseSession(session, getSessionFactory());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getIdExp(int selectIdx, int fromIdx, String origenHql) {
|
||||||
|
int dotIdIndex;//.id 位置
|
||||||
|
int nearestSpaceToId;//离.id最近的空格
|
||||||
|
dotIdIndex = origenHql.toLowerCase().indexOf(".id ", selectIdx);
|
||||||
|
if(dotIdIndex == -1 || dotIdIndex > fromIdx) {
|
||||||
|
dotIdIndex = origenHql.toLowerCase().indexOf(".id,", selectIdx);
|
||||||
|
if(dotIdIndex == -1){
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String temp = origenHql.substring(0, dotIdIndex);
|
||||||
|
nearestSpaceToId = temp.toLowerCase().lastIndexOf(" ");
|
||||||
|
if(nearestSpaceToId == -1) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return origenHql.substring(nearestSpaceToId, dotIdIndex + 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String whiteSpaceSplitHql(String hql) {
|
||||||
|
String[] array = StringUtils.split(hql);
|
||||||
|
StringBuffer buffer = new StringBuffer();
|
||||||
|
for(String token : array){
|
||||||
|
buffer.append(token);
|
||||||
|
buffer.append(" ");
|
||||||
|
}
|
||||||
|
return buffer.toString();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param info
|
||||||
|
* @param list
|
||||||
|
* @return DefaultListBackValueList instance
|
||||||
|
*/
|
||||||
|
protected ValueList getListBackedValueList(ValueListInfo info, List list) {
|
||||||
|
return new DefaultListBackedValueList(list,info);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param info
|
||||||
|
* @param results
|
||||||
|
* @throws HibernateException
|
||||||
|
* @throws NoSuchMethodException
|
||||||
|
* @throws InvocationTargetException
|
||||||
|
* @throws IllegalAccessException
|
||||||
|
*/
|
||||||
|
private void doFocusFor(ValueListInfo info, ScrollableResults results)
|
||||||
|
throws HibernateException
|
||||||
|
{
|
||||||
|
info.setFocusStatus(ValueListInfo.FOCUS_NOT_FOUND);
|
||||||
|
|
||||||
|
int currentRow;
|
||||||
|
if (isFocusOptimalization() == true)
|
||||||
|
{
|
||||||
|
LOGGER.debug("Focusing only property '" + info.getFocusProperty() + "' == '" +info.getFocusValue()+"'." );
|
||||||
|
for (currentRow = 0; ((results.next()) && (currentRow < maxRowsForFocus)); currentRow++)
|
||||||
|
{
|
||||||
|
String value = results.get(0).toString();
|
||||||
|
if (value.equalsIgnoreCase(info.getFocusValue()))
|
||||||
|
{
|
||||||
|
LOGGER.info("Focus property '" + info.getFocusProperty() + "' in row '" + currentRow +"'." );
|
||||||
|
info.setPagingPageFromRowNumber(results.getRowNumber());
|
||||||
|
info.setFocusedRowNumberInTable(results.getRowNumber());
|
||||||
|
info.setFocusStatus(ValueListInfo.FOCUS_FOUND);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOGGER.debug("Focusing object with the property '" + info.getFocusProperty() + "' == '" +info.getFocusValue()+"'." );
|
||||||
|
for (currentRow = 0; ((results.next()) && (currentRow < maxRowsForFocus)); currentRow++)
|
||||||
|
{
|
||||||
|
|
||||||
|
Object value;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
value = PropertyUtils.getProperty(results.get(0), info
|
||||||
|
.getFocusProperty());
|
||||||
|
}
|
||||||
|
catch (HibernateException e)
|
||||||
|
{
|
||||||
|
LOGGER.error("Error getting focus property '" + info.getFocusProperty() + "'",e);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
LOGGER.warn("Ingoring error while getting focus property '" + info.getFocusProperty() + "'",e);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value.toString().equalsIgnoreCase(info.getFocusValue()))
|
||||||
|
{
|
||||||
|
LOGGER.info("Focus object's property '" + info.getFocusProperty() + "' was found in the row '" + currentRow +"'." );
|
||||||
|
info.setPagingPageFromRowNumber(results.getRowNumber());
|
||||||
|
info.setFocusedRowNumberInTable(results.getRowNumber());
|
||||||
|
info.setFocusStatus(ValueListInfo.FOCUS_FOUND);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( currentRow == maxRowsForFocus)
|
||||||
|
{
|
||||||
|
LOGGER.info("Focus for property '" + info.getFocusProperty() + "' exceded maximum rows for focus '" + maxRowsForFocus +"'." );
|
||||||
|
info.setFocusStatus(ValueListInfo.FOCUS_TOO_MANY_ITEMS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param query
|
||||||
|
* @param info ValueListInfo This info will be set to validator.
|
||||||
|
* @return ScrollableResults, if is set non null _validator, it returns the
|
||||||
|
* ScrollableResultsDecorator.
|
||||||
|
* @throws HibernateException
|
||||||
|
*/
|
||||||
|
private ScrollableResults getScrollableResults(Query query, ValueListInfo info)
|
||||||
|
throws HibernateException
|
||||||
|
{
|
||||||
|
ScrollableResults results;
|
||||||
|
|
||||||
|
if (_validator == null)
|
||||||
|
{
|
||||||
|
LOGGER.debug("Validator is null, using normal ScrollableResults");
|
||||||
|
results = query.scroll();
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOGGER.info("Using decorator of the ScrollableResults with your validator.");
|
||||||
|
_validator.setValueListInfo(info);
|
||||||
|
results = new ScrollableResultsDecorator(query.scroll(), _validator);
|
||||||
|
}
|
||||||
|
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param info
|
||||||
|
* @param session
|
||||||
|
* @return @throws
|
||||||
|
* HibernateException
|
||||||
|
*/
|
||||||
|
private Query getQuery(String hql,ValueListInfo info, Session session)
|
||||||
|
throws HibernateException, ParseException
|
||||||
|
{
|
||||||
|
|
||||||
|
if (hql != null)
|
||||||
|
{
|
||||||
|
return getStatementBuilder().generate(session,
|
||||||
|
new StringBuffer(hql), info.getFilters(),
|
||||||
|
_isRemoveEmptyStrings);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (namedQuery != null)
|
||||||
|
{
|
||||||
|
return session.getNamedQuery(getNamedQuery());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new HibernateException(
|
||||||
|
"Please define any QUERY in value list retrieve adpater!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If focus optimalization is true, it select only focus property. For
|
||||||
|
* validator is recommended to set it to false, while you want to validate
|
||||||
|
* properties of retrieved objects.
|
||||||
|
*
|
||||||
|
* @param info
|
||||||
|
* @param session
|
||||||
|
* @return
|
||||||
|
* @throws HibernateException
|
||||||
|
*/
|
||||||
|
private Query getQueryForFocus(ValueListInfo info, Session session)
|
||||||
|
throws HibernateException, ParseException
|
||||||
|
{
|
||||||
|
if (isFocusOptimalization() == true)
|
||||||
|
{
|
||||||
|
LOGGER.info("Focus will use optimalizated query.");
|
||||||
|
return getOptimizedQuery(info, session);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOGGER.info("Focus will use normal (full) query.");
|
||||||
|
// return getQuery(info, session);
|
||||||
|
// ignore focus query altered by wenshuang.ma
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param info
|
||||||
|
* @param session
|
||||||
|
* @return query that select only focus property.
|
||||||
|
* @throws HibernateException
|
||||||
|
* @throws ParseException
|
||||||
|
*/
|
||||||
|
private Query getOptimizedQuery(ValueListInfo info, Session session) throws HibernateException, ParseException
|
||||||
|
{
|
||||||
|
if (getHql() != null)
|
||||||
|
{
|
||||||
|
return getStatementBuilder().generateForFocus(session,
|
||||||
|
new StringBuffer(getHql()), info.getFilters(),
|
||||||
|
_isRemoveEmptyStrings, defaultFocusPropertyObjectAlias,
|
||||||
|
info.getFocusProperty());
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new HibernateException(
|
||||||
|
"Please define any HQL QUERY in value list retrieve adpater, function is not implemented for NamedQuery!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Set the Hibernate SessionFactory to be used by this DAO.
|
||||||
|
*
|
||||||
|
* @param sessionFactory The Hibernate SessionFactory to be used by this DAO.
|
||||||
|
*/
|
||||||
|
public final void setSessionFactory(SessionFactory sessionFactory)
|
||||||
|
{
|
||||||
|
this.sessionFactory = sessionFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Return the Hibernate SessionFactory used by this DAO.
|
||||||
|
*
|
||||||
|
* @return The Hibernate SessionFactory used by this DAO.
|
||||||
|
*/
|
||||||
|
protected final SessionFactory getSessionFactory()
|
||||||
|
{
|
||||||
|
return this.sessionFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Sets the hql used to retrieve the data.
|
||||||
|
* @param query
|
||||||
|
* The hql to set.
|
||||||
|
* @deprecated use setHql(String)
|
||||||
|
*/
|
||||||
|
public void setHsql(String hql)
|
||||||
|
{
|
||||||
|
this.hql = hql;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Sets the hql used to retrieve the data.
|
||||||
|
* @param query
|
||||||
|
* The hql to set.
|
||||||
|
*/
|
||||||
|
public void setHql(String hql)
|
||||||
|
{
|
||||||
|
this.hql = hql;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns the namedQuery.
|
||||||
|
* @return Returns the namedQuery.
|
||||||
|
*/
|
||||||
|
public String getNamedQuery()
|
||||||
|
{
|
||||||
|
return namedQuery;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Sets the namedQuery.
|
||||||
|
* <p>
|
||||||
|
* NOTE: by using this you can not enable sorting, filtering,
|
||||||
|
* paging of the data, and focusing of rows.
|
||||||
|
* </p>
|
||||||
|
* @param namedQuery
|
||||||
|
* The namedQuery to set.
|
||||||
|
*/
|
||||||
|
public void setNamedQuery(String namedQuery)
|
||||||
|
{
|
||||||
|
this.namedQuery = namedQuery;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Gets the hql used to retrieve the data.
|
||||||
|
* @return Returns the hql.
|
||||||
|
*/
|
||||||
|
public String getHql()
|
||||||
|
{
|
||||||
|
return hql;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Sets: If a new Session should be created if no thread-bound found.
|
||||||
|
*
|
||||||
|
* @param allowCreate
|
||||||
|
* The allowCreate to set.
|
||||||
|
*/
|
||||||
|
public void setAllowCreate(boolean allowCreate)
|
||||||
|
{
|
||||||
|
this.allowCreate = allowCreate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maximum rows to search with Focus
|
||||||
|
*
|
||||||
|
* @return Returns the maxRowsForFocus.
|
||||||
|
*/
|
||||||
|
public long getMaxRowsForFocus()
|
||||||
|
{
|
||||||
|
return maxRowsForFocus;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maximum rows to search with Focus
|
||||||
|
*
|
||||||
|
* @param maxRowsForFocus
|
||||||
|
* The maxRowsForFocus to set.
|
||||||
|
*/
|
||||||
|
public void setMaxRowsForFocus(long maxRowsForFocus)
|
||||||
|
{
|
||||||
|
this.maxRowsForFocus = maxRowsForFocus;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the defaultFocusPropertyObject.
|
||||||
|
*/
|
||||||
|
public String getDefaultFocusPropertyObjectAlias()
|
||||||
|
{
|
||||||
|
return defaultFocusPropertyObjectAlias;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of object use to get focus property in hibernate hql syntax
|
||||||
|
* SELECT defaultFocusPropertyObjectAlias.getFocusProperty ...
|
||||||
|
*
|
||||||
|
* @param defaultFocusPropertyObjectAlias
|
||||||
|
* The defaultFocusPropertyObjectAlias to set.
|
||||||
|
*/
|
||||||
|
public void setDefaultFocusPropertyObjectAlias(
|
||||||
|
String defaultFocusPropertyObjectAlias)
|
||||||
|
{
|
||||||
|
this.defaultFocusPropertyObjectAlias = defaultFocusPropertyObjectAlias
|
||||||
|
+ ".";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the statementBuilder.
|
||||||
|
*/
|
||||||
|
public StatementBuilder getStatementBuilder()
|
||||||
|
{
|
||||||
|
if (statementBuilder == null)
|
||||||
|
{
|
||||||
|
statementBuilder = new StatementBuilder();
|
||||||
|
}
|
||||||
|
return statementBuilder;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param statementBuilder The statementBuilder to set.
|
||||||
|
*/
|
||||||
|
public void setStatementBuilder(StatementBuilder statementBuilder)
|
||||||
|
{
|
||||||
|
this.statementBuilder = statementBuilder;
|
||||||
|
}
|
||||||
|
public ValueList scrollableQuery(String pureHql, ValueListInfo info, Map queryParams) {
|
||||||
|
if (info.getPagingNumberPer() == Integer.MAX_VALUE)
|
||||||
|
{
|
||||||
|
info.setPagingNumberPer(getDefaultNumberPerPage());
|
||||||
|
if (LOGGER.isDebugEnabled()) {
|
||||||
|
LOGGER.debug("The paging number per page '" + getDefaultNumberPerPage() + "' was set.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Session session = SessionFactoryUtils.getSession(getSessionFactory(),allowCreate);
|
||||||
|
List list;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Query query = session.createQuery(pureHql);
|
||||||
|
if(cacheRegion != null){
|
||||||
|
query.setCacheable(true);
|
||||||
|
query.setCacheRegion(cacheRegion);
|
||||||
|
query.setCacheMode(CacheMode.NORMAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(Object object : queryParams.entrySet()){
|
||||||
|
Map.Entry entry = (Entry) object;
|
||||||
|
if(entry.getValue() instanceof Collection) {
|
||||||
|
query.setParameterList(entry.getKey().toString(),(Collection)entry.getValue());
|
||||||
|
}else{
|
||||||
|
query.setParameter(entry.getKey().toString(),entry.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
list = new ArrayList(info.getPagingNumberPer());
|
||||||
|
ScrollableResults results = getScrollableResults(query, info);
|
||||||
|
if (results.first())
|
||||||
|
{
|
||||||
|
int pageNumber = info.getPagingPage();
|
||||||
|
int numberPerPage = (info.getPagingNumberPer() > 0) ? info
|
||||||
|
.getPagingNumberPer() : getDefaultNumberPerPage();
|
||||||
|
|
||||||
|
if (info.getPagingPage() > 1)
|
||||||
|
{
|
||||||
|
results.scroll((pageNumber - 1) * numberPerPage);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < numberPerPage; i++)
|
||||||
|
{
|
||||||
|
Object[] result = results.get();
|
||||||
|
if(result.length == 1 && result[0] instanceof DomainModel){
|
||||||
|
list.add(result[0]);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
list.add(result);
|
||||||
|
}
|
||||||
|
if (!results.next())
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
results.last();
|
||||||
|
info.setTotalNumberOfEntries(results.getRowNumber() + 1);
|
||||||
|
}
|
||||||
|
if (LOGGER.isDebugEnabled())
|
||||||
|
{
|
||||||
|
LOGGER.debug("Sorting finished.");
|
||||||
|
}
|
||||||
|
ValueList returnValueList = getListBackedValueList(info, list);
|
||||||
|
if (LOGGER.isDebugEnabled())
|
||||||
|
{
|
||||||
|
LOGGER.debug("Retrieved list was wrapped in valuelist, info="
|
||||||
|
+ info);
|
||||||
|
}
|
||||||
|
return returnValueList;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
SessionFactoryUtils.releaseSession(session, getSessionFactory());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
public String getCacheRegion() {
|
||||||
|
return cacheRegion;
|
||||||
|
}
|
||||||
|
public void setCacheRegion(String cacheRegion) {
|
||||||
|
this.cacheRegion = cacheRegion;
|
||||||
|
}
|
||||||
|
public ValueList getValueListNoCount(String hql, ValueListInfo info) {
|
||||||
|
if (LOGGER.isDebugEnabled())
|
||||||
|
{
|
||||||
|
LOGGER.debug("getValueList(String, ValueListInfo) - start");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info.getSortingColumn() == null)
|
||||||
|
{
|
||||||
|
info.setPrimarySortColumn(getDefaultSortColumn());
|
||||||
|
info.setPrimarySortDirection(getDefaultSortDirectionInteger());
|
||||||
|
if (LOGGER.isDebugEnabled()) {
|
||||||
|
LOGGER.debug("The default sort column '" + getDefaultSortColumn() + "' with direction '"+getDefaultSortDirectionInteger()+"' was set.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info.getPagingNumberPer() == Integer.MAX_VALUE)
|
||||||
|
{
|
||||||
|
info.setPagingNumberPer(getDefaultNumberPerPage());
|
||||||
|
if (LOGGER.isDebugEnabled()) {
|
||||||
|
LOGGER.debug("The paging number per page '" + getDefaultNumberPerPage() + "' was set.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Session session = SessionFactoryUtils.getSession(getSessionFactory(),allowCreate);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Query query = getQuery(hql,info, session);
|
||||||
|
int numberPerPage = info.getPagingNumberPer();
|
||||||
|
ArrayList list = new ArrayList(numberPerPage);
|
||||||
|
ScrollableResults results = getScrollableResults(query, info);
|
||||||
|
results.first();
|
||||||
|
// int lastRowNumber = results.getRowNumber();
|
||||||
|
// info.setTotalNumberOfEntries(lastRowNumber + 1);
|
||||||
|
if (numberPerPage == 0)
|
||||||
|
{
|
||||||
|
numberPerPage = getDefaultNumberPerPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
int pageNumber = info.getPagingPage();
|
||||||
|
boolean isResult;
|
||||||
|
if (pageNumber > 1)
|
||||||
|
{
|
||||||
|
isResult = results.scroll((pageNumber - 1) * numberPerPage);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
isResult = results.first();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < numberPerPage && isResult; i++)
|
||||||
|
{
|
||||||
|
Object[] objs = results.get();
|
||||||
|
if(objs != null && 1 == objs.length){
|
||||||
|
list.add(objs[0]);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
list.add(objs);
|
||||||
|
}
|
||||||
|
|
||||||
|
isResult = results.next();
|
||||||
|
}
|
||||||
|
results.close();
|
||||||
|
ValueList returnValueList = getListBackedValueList(info, list);
|
||||||
|
if (LOGGER.isDebugEnabled())
|
||||||
|
{
|
||||||
|
LOGGER.debug("Retrieved list was wrapped in valuelist, info="
|
||||||
|
+ info);
|
||||||
|
}
|
||||||
|
return returnValueList;
|
||||||
|
}
|
||||||
|
catch (HibernateException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
throw SessionFactoryUtils.convertHibernateAccessException(e);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
finally{
|
||||||
|
SessionFactoryUtils.releaseSession(session, getSessionFactory());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue