Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有可变数量的OR LIKE子句的休眠条件_Java_Mysql_Hibernate_Criteria - Fatal编程技术网

Java 具有可变数量的OR LIKE子句的休眠条件

Java 具有可变数量的OR LIKE子句的休眠条件,java,mysql,hibernate,criteria,Java,Mysql,Hibernate,Criteria,我对hibernate还比较陌生,目前正在努力使用条件触发查询 我想要实现的是,在first或lastname列中选择包含特定字符串的所有记录 这是我的。这应该是一个更好的主意 Session session = HibernateUtil.openSession(); Criteria criteria = session.createCriteria(Contact.class); if(keywords != null) { for(String keyw

我对hibernate还比较陌生,目前正在努力使用条件触发查询

我想要实现的是,在first或lastname列中选择包含特定字符串的所有记录

这是我的。这应该是一个更好的主意

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();
因此,最终的查询应该是这样的:

从联系人中选择*(firstname,如“%oe%”或lastname,如“%oe%”),如果给出了多个关键字,则类似于:

从联系人中选择*,其中(名为“%oe%”或姓为“%oe%”或(名为“%roo%”或姓为“%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)
这就产生了这个查询,这几乎就是我想要的。我只想要“和”成为“或”。因此:

我想成为:

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 ?
    )

每次调用
criteria.add
,它都会在语句中添加一个
。 要创建析取,请执行以下操作:

Disjunction matchDisjunction = Restrictions.disjunction()
for(String keyword : keywords) {
            if(keyword != null && keyword.length() > 0) {
                matchDisjunction.add(
                        Restrictions.or(
                            Restrictions.like("lastName", keyword, MatchMode.ANYWHERE), 
                            Restrictions.like("firstName", keyword, MatchMode.ANYWHERE)
                        ));
            }
        }
criteria.add(matchDisjunction);
或者简单地说:

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

非常感谢你抽出时间。我还没有时间测试它。今晚我会的。期待它。
Disjunction matchDisjunction = Restrictions.disjunction()
for(String keyword : keywords) {
            if(keyword != null && keyword.length() > 0) {
                matchDisjunction.add(
                        Restrictions.or(
                            Restrictions.like("lastName", keyword, MatchMode.ANYWHERE), 
                            Restrictions.like("firstName", keyword, MatchMode.ANYWHERE)
                        ));
            }
        }
criteria.add(matchDisjunction);
Disjunction matchDisjunction = Restrictions.disjunction()
for(String keyword : keywords) {
            if(keyword != null && keyword.length() > 0) {
                matchDisjunction.add( Restrictions.like("lastName", keyword, MatchMode.ANYWHERE) );
                matchDisjunction.add( Restrictions.like("firstName", keyword, MatchMode.ANYWHERE) );
            }
        }
criteria.add(matchDisjunction);