Java Hibernate Criteria.list()在神秘的情况下抛出NullPointerException
我有一个字符串数组,比如[“foo”,“bar”,“baz”]。我正在尝试查找包含以下任一单词的所有记录,例如: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%')和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()。我没有意识到其余部分将为空。谢谢!