Tag Archives: hibernate

从hibernate criteria 或者 HQL 得到 SQL

啥也不说,直接无节操上代码

[code lang="java"]
import java.lang.reflect.Field;
import java.util.Collections;

import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.engine.SessionFactoryImplementor;
import org.hibernate.hql.QueryTranslator;
import org.hibernate.hql.QueryTranslatorFactory;
import org.hibernate.hql.ast.ASTQueryTranslatorFactory;
import org.hibernate.impl.CriteriaImpl;
import org.hibernate.impl.SessionImpl;
import org.hibernate.loader.OuterJoinLoader;
import org.hibernate.loader.criteria.CriteriaLoader;
import org.hibernate.persister.entity.OuterJoinLoadable;

public class HibernateHqlAndCriteriaToSqlTranslator
{
private SessionFactory sessionFactory;

public void setSessionFactory(SessionFactory sessionFactory)
{
this.sessionFactory = sessionFactory;
}

public String toSql(Criteria criteria)
{
try
{
CriteriaImpl c = (CriteriaImpl) criteria;
SessionImpl s = (SessionImpl) c.getSession();
SessionFactoryImplementor factory = (SessionFactoryImplementor) s.getSessionFactory();
String[] implementors = factory.getImplementors(c.getEntityOrClassName());
CriteriaLoader loader = new CriteriaLoader((OuterJoinLoadable) factory.getEntityPersister(implementors[0]), factory, c,
implementors[0], s.getEnabledFilters());
Field f = OuterJoinLoader.class.getDeclaredField("sql");
f.setAccessible(true);
return (String) f.get(loader);
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}

public String toSql(String hqlQueryText)
{
if (hqlQueryText != null && hqlQueryText.trim().length() > 0)
{
final QueryTranslatorFactory translatorFactory = new ASTQueryTranslatorFactory();
final SessionFactoryImplementor factory = (SessionFactoryImplementor) sessionFactory;
final QueryTranslator translator = translatorFactory.createQueryTranslator(hqlQueryText, hqlQueryText,
Collections.EMPTY_MAP, factory);
translator.compile(Collections.EMPTY_MAP, false);
return translator.getSQLString();
}
return null;
}
}
[/code]

参考:
hibernate criteria to sql translation

hibernate 通过类属性名得到数据库表字段名

因为项目的变态需求,想使用hibernate,同时又要使用SP而不用hibernate的自动生成的sql。因此做的过程中就面临这样的问题,如何通过POJO类的属性名得到数据库表的字段名,我们知道,这两者的映射关系是维护在xml文件中的。
Continue reading