2

HibernateTemplate.findByCriteriaメソッドを使用していくつかのクエリを実行しています。ここで、基準にいくつかのSQL制限を作成したいと思いました。

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

問題は、ClassBのオブジェクトと関係のある1つのオブジェクトClass Aをフェッチしようとしていて、両方のクラスに「name」(または「id」または...)という名前のフィールドがあるため、休止状態のエンジンが結合を行うことです。列名が繰り返されるテーブル。オブジェクトタイプに基づいて制限を指定するにはどうすればよいですか?

{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);
4

1 に答える 1

3

たとえば、ユーザーのフィールドにアクセスできるようにするには、結合を作成する必要があります。

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();
于 2012-07-19T15:33:45.223 に答える