我创建了一个方法,该方法基于给定的实体(我使用JPA)为java中的表返回原始html。现在,我希望能够使用比较器接口对表进行排序。因此,我创建了比较器接口的匿名内部类,以对实体的属性进行排序。这工作正常,但是我的问题是我现在无法对NullsFirst或Nullslast进行排序。我尝试过的所有方法均无效。有谁知道如何解决这个问题?

这是代码:

if (!sortProperty.equals("") && sortProperty != null) {
        Collections.sort(list, new Comparator<T>() {
            public int compare(T e1, T e2) {
                Method sortGetter = null;
                try {
                    for (PropertyDescriptor pd : Introspector.getBeanInfo(entity).getPropertyDescriptors()) {
                        if (pd.getName().equals(sortProperty) && pd.getReadMethod() != null) {
                            sortGetter = pd.getReadMethod();
                        }
                    }
                } catch (IntrospectionException e) {
                    e.printStackTrace();
                }

                try {
                        if (sortGetter.getReturnType().equals(String.class)) {
                            return sortGetter.invoke(e1).toString().compareTo(sortGetter.invoke(e2).toString());
                        } else if (sortGetter.getReturnType().equals(Integer.TYPE)) {
                                return (Integer) sortGetter.invoke(e1) - (Integer) sortGetter.invoke(e2);
                        } else if (sortGetter.getReturnType().equals(Date.class)) {
                                return ((Date) sortGetter.invoke(e1)).compareTo((Date) sortGetter.invoke(e2));
                        } else if (sortGetter.getReturnType().equals(Timestamp.class)) {
                                return ((Timestamp) sortGetter.invoke(e1)).compareTo((Timestamp) sortGetter.invoke(e2));
                        }
                } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
                    e.printStackTrace();
                }
                return 0;
            }
        });
    }

最佳答案

sortGetter.invoke(e1)sortGetter.invoke(e2)拉出到变量中(为清楚起见,省略了try / catch):

Object o1 = sortGetter.invoke(e1);
Object o2 = sortGetter.invoke(e2);


检查是否为空,如果为空,则返回:

if (o1 == null || o2 == null) {
  // This results in nulls last. Use != for nulls first.
  return Boolean.compare(o1 == null, o2 == null);
}


现在,您可以继续使用if (sortGetter.getReturnType().equals(String.class))类型的逻辑(显然,您无需再次调用sortGetter.invoke(e1)sortGetter.invoke(e2))。

07-26 05:24