Java Hibernate Criteria.list()在神秘的情况下抛出NullPointerException

Java Hibernate Criteria.list()在神秘的情况下抛出NullPointerException,java,mysql,hibernate,debugging,Java,Mysql,Hibernate,Debugging,我有一个字符串数组,比如[“foo”,“bar”,“baz”]。我正在尝试查找包含以下任一单词的所有记录,例如: 从城市中选择*(名称如'%foo%'或名称如'%bar%'或名称如'%baz%') 有时还可能存在一个状态,在该状态中,我需要查询如下: 从城市中选择*(名称如'%foo%'或名称如'%bar%'或名称如'%baz%')和stateId=11 我使用Hibernate标准进行这些搜索,以下是我的方法: public static List<City> findByPart

我有一个字符串数组,比如[“foo”,“bar”,“baz”]。我正在尝试查找包含以下任一单词的所有记录,例如:

从城市中选择*(名称如'%foo%'或名称如'%bar%'或名称如'%baz%')

有时还可能存在一个状态,在该状态中,我需要查询如下:

从城市中选择*(名称如'%foo%'或名称如'%bar%'或名称如'%baz%')和stateId=11

我使用Hibernate标准进行这些搜索,以下是我的方法:

public static List<City> findByPartialName(State state, String... names)
{
    if (names.length <= 0)
        return null;

    Criteria cr = session.createCriteria(City.class);
    boolean found = false;
    Criterion[] conditions = new Criterion[names.length];
    List<String> doneWords = new ArrayList<>( names.length );
    int i =0;
    for (String city : names)
    {
        city = city.trim();
        if (city.isEmpty() || city.length() < 3)
            continue;

        if ( doneWords.contains(city) )
            continue;

        found = true;
        conditions[i] = Restrictions.like("name", "%" + city + "%");
        doneWords.add(city);
        i++;
    }
    if (! found)
        return null;

    cr.add( Restrictions.or( conditions ) );

    if (state != null)
        cr.add( Restrictions.eq("state", state) );

    try
    {
        List<City> cities = cr.list();
        return cities;
    }
    catch (ObjectNotFoundException e)
    {
        return null;
    }
}
公共静态列表findByPartialName(状态、字符串…名称)
{

如果(names.length问题似乎来自Criteria数组,即使数组中包含空名称、小于3个字符的名称或重复名称,也会根据收到的名称数调整数组的大小。在这种情况下,数组将包含小于names.length Criteria对象,其余数组包含导致NPE的空引用。而不是条件数组您应该使用一个列表,并使用toArray()将其传递给Restrictions.or()。

我没有意识到其余部分将为空。谢谢!