1

私は冬眠するのはかなり初めてで、現在、基準を使用してクエリを実行するのに苦労しています。

私が達成したいのは、姓または名の列に特定の文字列を含むすべてのレコードを選択することです。

これが私が持っているものです。それはより良いアイデアを与えるはずです。

Session session = HibernateUtil.openSession();
    Criteria criteria = session.createCriteria(Contact.class);

    if(keywords != null) {
        for(String keyword : keywords) {
            if(keyword != null && keyword.length() > 0) {
                criteria.add(Restrictions.like("firstName", keyword, MatchMode.ANYWHERE));
                criteria.add(Restrictions.or(Restrictions.like("lastName", keyword, MatchMode.ANYWHERE), null));
            }
        }
    }

    searchMatches = criteria.list();

したがって、最終的にクエリは次のようになります。

SELECT * FROM contact WHERE (firstname LIKE '%oe% OR lastname LIKE '%oe%')、および複数のキーワードが指定されている場合は、次のようになります。

SELECT * FROM contact WHERE (firstname LIKE '%oe% OR lastname LIKE '%oe%') OR (firstname LIKE '%roo% OR lastname LIKE '%roo%')

これにより、first または lastname 列のいずれかに「oe」を含むレコードが選択されます。criteria.list(); のときにコードでクラッシュする方法 実行されます。

これがスタックトレースです。何が間違っているのかわかりません。

Caused by: java.lang.NullPointerException
at org.hibernate.criterion.LogicalExpression.toSqlString(LogicalExpression.java:60)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:419)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:123)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:92)
at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:93)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1464)
at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:374)
at com.joey.wishlist.dao.impl.ContactDAOImpl.searchContacts(ContactDAOImpl.java:34)
at com.joey.wishlist.services.impl.ContactServiceImpl.searchContacts(ContactServiceImpl.java:22)
at com.joey.wishlist.presenters.ContactSearchPresenter.search(ContactSearchPresenter.java:75)

編集:私は一歩近づいています。

エラーを修正しました。エラーの原因は、誤動作または.

コードは次のようになります。

        if(keywords != null) {
        for(String keyword : keywords) {
            if(keyword != null && keyword.length() > 0) {
                criteria.add(
                        Restrictions.or(
                            Restrictions.like("lastName", keyword, MatchMode.ANYWHERE), 
                            Restrictions.like("firstName", keyword, MatchMode.ANYWHERE)
                        ));
            }
        }
    }

これは、ほとんど私が望むものであるこのクエリを生成します。「AND」を「OR」にしたいだけです。そう:

Hibernate: 
/* criteria query */ select
    this_.id as id0_0_,
    this_.firstname as firstname0_0_,
    this_.lastname as lastname0_0_ 
from
    contactmanager this_ 
where
    (
        this_.lastname like ? 
        or this_.firstname like ?
    ) 
    and (
        this_.lastname like ? 
        or this_.firstname like ?
    )

私はなりたい:

Hibernate: 
/* criteria query */ select
    this_.id as id0_0_,
    this_.firstname as firstname0_0_,
    this_.lastname as lastname0_0_ 
from
    contactmanager this_ 
where
    (
        this_.lastname like ? 
        or this_.firstname like ?
    ) 
    or ( //Notice difference here
        this_.lastname like ? 
        or this_.firstname like ?
    )
4

1 に答える 1