下面列出了怎么用org.hibernate.loader.criteria.CriteriaQueryTranslator的API类实例代码及写法,或者点击链接到github查看源代码。
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery)
throws HibernateException {
final SessionImplementor session = ( (CriteriaImpl) criteria ).getSession(); //ugly!
final SessionFactoryImplementor factory = session.getFactory();
final OuterJoinLoadable persister = (OuterJoinLoadable) factory.getEntityPersister( criteriaImpl.getEntityOrClassName() );
CriteriaQueryTranslator innerQuery = new CriteriaQueryTranslator(
factory,
criteriaImpl,
criteriaImpl.getEntityOrClassName(), //implicit polymorphism not supported (would need a union)
criteriaQuery.generateSQLAlias(),
criteriaQuery
);
params = innerQuery.getQueryParameters(); //TODO: bad lifecycle....
types = innerQuery.getProjectedTypes();
//String filter = persister.filterFragment( innerQuery.getRootSQLALias(), session.getEnabledFilters() );
String sql = new Select( factory.getDialect() )
.setWhereClause( innerQuery.getWhereCondition() )
.setGroupByClause( innerQuery.getGroupBy() )
.setSelectClause( innerQuery.getSelect() )
.setFromClause(
persister.fromTableFragment( innerQuery.getRootSQLALias() ) +
persister.fromJoinFragment( innerQuery.getRootSQLALias(), true, false )
)
.toStatementString();
final StringBuffer buf = new StringBuffer()
.append( toLeftSqlString(criteria, criteriaQuery) );
if (op!=null) buf.append(' ').append(op).append(' ');
if (quantifier!=null) buf.append(quantifier).append(' ');
return buf.append('(').append(sql).append(')')
.toString();
}
private static LinkedHashMap<String, Projection> applyExpandDateModeCriterions(org.hibernate.Criteria visitScheduleItemCriteria, Long probandId, Timestamp from, Timestamp to,
org.hibernate.criterion.Criterion or) {
// cartesian product <visitscheduleitems> x <start tag values> x <stop tag values>
org.hibernate.Criteria startTagValuesCriteria = visitScheduleItemCriteria.createCriteria("startTag", CriteriaSpecification.LEFT_JOIN)
.createCriteria("tagValues", "startTagValues", CriteriaSpecification.LEFT_JOIN);
org.hibernate.Criteria startTagValuesValueCriteria = startTagValuesCriteria.createCriteria("value",
CriteriaSpecification.LEFT_JOIN);
org.hibernate.Criteria stopTagValuesCriteria = visitScheduleItemCriteria.createCriteria("stopTag", CriteriaSpecification.LEFT_JOIN).createCriteria("tagValues",
"stopTagValues", CriteriaSpecification.LEFT_JOIN);
org.hibernate.Criteria stopTagValuesValueCriteria = stopTagValuesCriteria.createCriteria("value", CriteriaSpecification.LEFT_JOIN);
// from the cross product, remove those with start+stop values of different probands. also include rows without existing stop tag values
visitScheduleItemCriteria.add(CriteriaUtil.applyOr(
Restrictions.or(Restrictions.eqProperty("startTagValues.listEntry.id", "stopTagValues.listEntry.id"), Restrictions.isNull("stopTagValues.listEntry.id")), or));
// narrow to particular proband, if given
org.hibernate.Criteria startTagValuesListEntryCriteria = startTagValuesCriteria.createCriteria("listEntry", "startTagValuesListEntry", CriteriaSpecification.LEFT_JOIN);
if (probandId != null) {
startTagValuesListEntryCriteria.add(CriteriaUtil.applyOr(Restrictions.or(Restrictions.isNull("proband.id"), Restrictions.eq("proband.id", probandId.longValue())), or));
}
// only rows with proband group matching the group of the visitschelute item (or those with no group)
visitScheduleItemCriteria
.add(CriteriaUtil.applyOr(Restrictions.or(Restrictions.isNull("startTagValuesListEntry.id"),
Restrictions.or(Restrictions.eqProperty("startTagValuesListEntry.group.id", "group.id"), Restrictions.isNull("group.id"))), or));
CriteriaQueryTranslator translator = CriteriaUtil.getCriteriaQueryTranslator(visitScheduleItemCriteria);
// prepare sql fragments:
String offsetSql = translator.getColumn(visitScheduleItemCriteria, "offsetSeconds");
String durationSql = translator.getColumn(visitScheduleItemCriteria, "duration");
String tagStartSql = translator.getColumn(startTagValuesValueCriteria, "timestampValue");
String tagStopSql = translator.getColumn(stopTagValuesValueCriteria, "timestampValue");
String tagStartOffsetSql = MessageFormat.format(Settings.getString(SettingCodes.SQL_ADD_SECONDS_TERM, Bundle.SETTINGS, null),
tagStartSql, offsetSql);
String tagStopOffsetSql = MessageFormat.format(Settings.getString(SettingCodes.SQL_ADD_SECONDS_TERM, Bundle.SETTINGS, null),
tagStopSql, offsetSql);
String durationStopOffsetSql = MessageFormat.format(Settings.getString(SettingCodes.SQL_ADD_SECONDS_TERM, Bundle.SETTINGS, null),
tagStartOffsetSql, durationSql);
String probandIdSql = translator.getColumn(startTagValuesListEntryCriteria, "proband.id");
// date filtering
Junction junction = Restrictions.disjunction();
if (or != null) {
junction.add(or);
}
if (from != null || to != null) {
junction.add(Restrictions.and(Restrictions.eq("mode", VisitScheduleDateMode.STATIC), CriteriaUtil.getClosedIntervalCriterion(from, to, null)));
junction.add(Restrictions.and(Restrictions.eq("mode", VisitScheduleDateMode.TAGS),
Restrictions.and(Restrictions.sqlRestriction("(" + tagStartSql + ") < (" + tagStopSql + ")"),
CriteriaUtil.getClosedIntervalCriterion(from, to, null, tagStartOffsetSql, tagStopOffsetSql))));
junction.add(
Restrictions.and(Restrictions.eq("mode", VisitScheduleDateMode.TAG_DURATION), Restrictions.and(Restrictions.sqlRestriction("(" + tagStartSql + ") is not null"),
CriteriaUtil.getClosedIntervalCriterion(from, to, null, tagStartOffsetSql, durationStopOffsetSql))));
visitScheduleItemCriteria.add(junction);
} else {
junction.add(Restrictions.eq("mode", VisitScheduleDateMode.STATIC));
junction.add(Restrictions.and(Restrictions.eq("mode", VisitScheduleDateMode.TAGS), Restrictions.sqlRestriction("(" + tagStartSql + ") < (" + tagStopSql + ")")));
junction.add(Restrictions.and(Restrictions.eq("mode", VisitScheduleDateMode.TAG_DURATION), Restrictions.sqlRestriction("(" + tagStartSql + ") is not null")));
}
visitScheduleItemCriteria.add(junction); //no stales any more
LinkedHashMap<String, Projection> sqlColumns = new LinkedHashMap<String, Projection>();
sqlColumns.put("tagStart", new SQLProjection(
tagStartOffsetSql + " as tagStart",
new String[] { "tagStart" },
new org.hibernate.type.Type[] { Hibernate.TIMESTAMP },
tagStartOffsetSql));
sqlColumns.put("tagStop", new SQLProjection(
tagStopOffsetSql + " as tagStop",
new String[] { "tagStop" },
new org.hibernate.type.Type[] { Hibernate.TIMESTAMP },
tagStopOffsetSql));
sqlColumns.put("durationStop", new SQLProjection(
durationStopOffsetSql + " as durationStop",
new String[] { "durationStop" },
new org.hibernate.type.Type[] { Hibernate.TIMESTAMP },
durationStopOffsetSql));
sqlColumns.put("probandId", new SQLProjection(
probandIdSql + " as probandId",
new String[] { "probandId" },
new org.hibernate.type.Type[] { Hibernate.LONG },
probandIdSql));
return sqlColumns;
}