0

名前付きJDBCテンプレートとクエリを使用して同様の一致を実行しようとしています...

SELECT
    id, guid, body, summary, status_id, language_id, is_mce, content_type_id, 
    last_edited_by, locked_by, owner_id, coordinator_id, writer_id, paperless, 
    content_body_type, created, updated, locked_timestamp
FROM dbo.content
WHERE notes LIKE :notes

:notesにバインドされて%test%おり、残念ながら結果は返されません。データベースをチェックして、このデータが存在することを確認しました。これは、同様の一致を実行するための正しい方法ではありませんか?

アップデート

このクエリを生成するコードの一部...

    String notes = search.getNotes();
    if (notes instanceof String && notes.length() > 0) {
        if (!previousClause) {
            searchQuery.append("WHERE ");
            previousClause = true;
        }
        searchQuery.append("notes LIKE :notes AND ");
        queryMap.put("notes", "%"+notes+"%");
    }

    Collection<Category> categories = search.getCategoryCollection();
    if (categories != null && categories.size() > 0) {
        Short x = 0;
        for (Category category : categories) {
            searchQuery.append("INNER JOIN dbo.content_to_category AS content_to_category"+x.toString()+" ON (content_to_category"+x.toString()+".category_id IN (:categoryId"+x.toString()+") AND content_to_category"+x.toString()+".content_id = content.id) ");
            queryMap.put("categoryId"+x.toString(), category.getId());
            x++;
        }
    }
4

1 に答える 1

0

(1) 適切なバージョンの Hibernate を使用している。(2) 上記の選択されたフィールドが のフィールドのサブセットであることcontent

次のようになります。

Criteria crit = session.createCriteria(Content.class);

// add all selected fields:
ProjectionList projList = Projections.projectionList();
projList.add(Projections.property("id"));
projList.add(Projections.property("guid"));
projList.add(Projections.property("body"));
projList.add(Projections.property("summary"));
projList.add(Projections.property("status_id"));
projList.add(Projections.property("language_id"));
projList.add(Projections.property("is_mce"));
projList.add(Projections.property("content_type_id"));
projList.add(Projections.property("last_edited_by"));
projList.add(Projections.property("locked_by"));
projList.add(Projections.property("owner_id"));
projList.add(Projections.property("coordinator_id"));
projList.add(Projections.property("writer_id"));
projList.add(Projections.property("coordinator_id"));
projList.add(Projections.property("paperless"));
projList.add(Projections.property("content_body_type"));
projList.add(Projections.property("created"));
projList.add(Projections.property("updated"));
projList.add(Projections.property("locked_timestamp"));
crit.setProjection(projList);

// add a Restriction on notes field, using like:
crit.add(Restrictions.like("notes", "test", MatchMode.ANYWHERE));

// invoke query:
List list = crit.list();

アップデート

念のため、使用すべき正しい構文は次のとおりです (直感といくつかのブログに依存しています。ドキュメントの抜粋を特定できませんでした)。

Query query = // create long complicated query that ends with "WHERE notes LIKE :notes"
query.setParameter("notes", "%test%");

あなたの場合、これが機能しない理由は、like演算子がオペランドなどに適用されるためvarcharです...そして、あなたのコードのこの部分から見えます:

if (notes instanceof String && notes.length() > 0) {

そのフィールドの基になる型について完全に確信が持てないこと...でnotesはないStringでしょうか?

于 2012-05-08T15:27:58.050 に答える