hibernate - Hibernate 连接表的标准

标签 hibernate hibernate-criteria

我正在使用 HibernateTemplate.findByCriteria 方法进行一些查询。现在我想对标准创建一些 SQL 限制,例如

criteria.add(Restrictions.sqlRestriction("name like '%abc%'")

问题是我正在尝试获取一个与 ClassB 的对象有关系的对象 Class A,并且两个类都有一个名为“name”(或“id”或...)的字段,因此 hibernate引擎对具有重复列名的表进行联接。如何根据对象类型指定限制?

我已经尝试过 {classA.name} 和类似的变体,但我收到了“不明确的列名称”异常。

示例(其中 criteria 是 Restrictions.sqlRestriction() 数组):

final DetachedCriteria criteria = DetachedCriteria.forClass(objectClass);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
for(Criterion criterion : criterions) {
    criteria.add(criterion);
}
List<T> results = template.findByCriteria(criteria, firstResult, maxResults);

最佳答案

您需要创建一个联接,例如为了能够访问用户的字段:

String username ="spnbldk";
criteria.createAlias("user", "u");
criteria.add(Restrictions.eq("u.name", username);

有关更多信息,请查看这些方法:

public class TaskDAO {

    public List<Task> findByCriteria(Map<String,String> aliasMap, List<Criterion> list) throws Exception {

                Criteria criteria = getSession().createCriteria(task.class);
                Iterator<Entry<String, String>> it = aliasMap.entrySet().iterator();
                while (it.hasNext()) {
                    Entry<String, String> pairs = it.next();
                    criteria.createAlias(pairs.getKey(), pairs.getValue());
                }
                for (Criterion criterion : list)
                    criteria.add(criterion);

                return criteria.list();
    }
}

然后您可以在服务类中使用它:

 public List<Task> get(String username) {
            try {
                // Manage Restrictions
                List<Criterion> list = new ArrayList<Criterion>();
                Criterion c = Restrictions.eq("u.username", username);
                list.add(c);

                Map<String,String> aliasMap = new HashMap<String, String>();
                    aliasMap.put("user", "u");


                List<Task> tasks = taskDAO.findByCriteria(aliasMap, orders);
                return tasks

            } catch (Exception e) { }
        }

“sqlRestriction”应该像这样工作:

Criteria criteria = session.createCriteria(Task.class);
criteria.add(Restrictions.sqlRestriction("{alias}.username like 'spn'));
List result = criteria.list();

关于hibernate - Hibernate 连接表的标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11562473/

相关文章:

grails - 如何获取grails中一列的所有数据?

java - 如何将 Hibernate 列表转换为字符串?

hibernate - 使用 Hibernate Criteria 连接两个表

java - Hibernate 无法反序列化错误

mysql - 数据库查询与优化-HQL

hibernate - Spring-boot & hibernate,使用事务

java - hibernate hbm : automatic (unwanted) update found

hibernate - EntityManager.createQuery() 抛出 NullPointerException

java - 如果我们在 hibernate 中只选择一列或多于一列,我们可以获得相同的返回类型吗?

oracle - 如何在Grails中左右联接标准查询