- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要使用动态搜索条件列表对动态对象列表进行排序。所以我有一个接受的方法
sort(List<SortCriterion> sortCriteria, List<T> searchList){
}
现在,如果我有一个 TradeOperator 的对象列表,如下所示。我可以在排序方法中发送其他对象,例如 CarOperator。
public class TradeOperator implements SearchResult{
private String name;
private String address;
private String status;
private Long regNum;
private Double price;
}
SortCriterion 代码如下所示。
public class SortCriterion{
protected String field;
protected String direction;
}
其中字段可以是 TradeOperator.name,方向 = ASC 或 DESC。现在我可以传递具有多个字段和方向的 SortCriterion 列表。
这就是我所做的。我收集了 MAP sortValues 中所有 ASC 字段和 DESC 字段,其中键 = ASC 和 DESC,值是字段列表。然后先按 ASC 排序,再按相反顺序排序。
sort(List<SortCriterion> sortCriteria, List<T> searchList){
Map<String, Set<String>> sortValues = new HashMap<>();
populateSortedValues(sortCriteria, "ASC", sortValues);//group fields on ASC or DESC as key = ASC and Value = List of Fields
populateSortedValues(sortCriteria, "DESC", sortValues);
if (null != sortValues.get(Constants.ASC_ORDER))
{
for (String ascendingOrder :
sortValues.get(Constants.ASC_ORDER))
{
Collections.sort(list, new SearchResultComparator(ascendingOrder));
}
}
if (null != sortValues.get(Constants.DESC_ORDER))
{
for (String descOrder : sortValues.get(Constants.DESC_ORDER))
{
Collections.sort(list, new
SearchResultComparator(descOrder).reversed());
}
}
}
这是 SearchResultComparator 类。
public class SearchResultComparator implements Comparator<Object> {
private String getter;
public SearchResultComparator(String field) {
this.getter = "get" + field.substring(0, 1).toUpperCase() + field.substring(1);
}
@SuppressWarnings("unchecked")
public int compare(Object o1, Object o2) {
try {
if (o1 != null && o2 != null) {
o1 = o1.getClass().getMethod(getter, new Class[0]).invoke(o1, new Object[0]);
o2 = o2.getClass().getMethod(getter, new Class[0]).invoke(o2, new Object[0]);
if(isDouble(o1.toString()) && isDouble(o2.toString())){
Double d1 = Double.parseDouble(o1.toString());
Double d2 = Double.parseDouble(o2.toString());
return (d1 == null) ? -1 : ((d2 == null) ? 1 : ((Comparable<Double>) d1).compareTo(d2));
}
}
} catch (Exception e) {
throw new SystemException("Cannot compare " + o1 + " with " + o2 + " on " + getter, e);
}
return (o1 == null) ? -1 : ((o2 == null) ? 1 : ((Comparable<Object>) o1).compareTo(o2));
}
public boolean isDouble(String value)
{
try
{
Double.parseDouble(value);
return true;
}
catch (NumberFormatException e)
{
return false;
}
}
}
它以一种方式排序。如果我对 ASC 中的一个字段进行排序,那么 DESC 中的另一个字段 ASC 排序就会丢失。请帮忙。我是 Java 新手。
最佳答案
您不需要 SearchResultComparator 或分离 ASC 和 DESC。使用此技术对任意顺序进行链式排序。
sort(List<SortCriterion> sortCriteria, List<T> list) {
Collections.sort(list, new Comparator<T>() {
public int compare(T one, T two) {
CompareToBuilder compToBuild = new CompareToBuilder();
sortCriteria.stream().forEachOrdered(sc -> {
String fieldName = sc.getField();
String direction = sc.getDirection();
String fv1 = getFieldValue(fieldName, one);
String fv2 = getFieldValue(fieldName, two);
if(direction.equals("ASC")) {
compToBuild.append(fv1, fv2);
}
if(direction.equals("DESC")) {
compToBuild.append(fv2, fv1);
}
});
return compToBuild.toComparison();
}
});
}
使用反射获取字段值
private String getFieldValue(String fieldName, T object) {
Field field;
try {
field = object.getClass().getDeclaredField(fieldName);
} catch (NoSuchFieldException e) {
logger.error(e);
return null;// or ""
}
field.setAccessible(true);
try {
return (String) field.get(object);
} catch (IllegalAccessException e) {
logger.error(e);
return null;// or ""
}
}
关于java - Java 中具有多个 Criteria 字段的动态排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56030090/
我需要创建一个 Hibernate 标准限制,或者 3 个条件。问题是最后一个条件实际上是使用 AND 运算符的条件。 我的第一个条件: Criterion startInRange = Restri
假设我的类型为 User,其中包含带有属性 Name 的类 Tenant 的对象。 我想从数据库用户中选择,其租户包含给定名称。 在 Hibernate Criteria 中,我可以使用别名简单地实现
select (case when dob = '2020-02-03' then 'adult' else 'teenage' end) as Age
我正在使用 Java 中的 hibernate 条件进行 MySql 查询。我在下面给出了我的代码的小快照。 Criteria criteria = getCurrentSession
我正在尝试使用条件查询进行删除。但看起来不错,但在运行时显示错误。我收到如下错误: Caused by: java.lang.AbstractMethodError: org.hibernate.ej
我目前正在尝试实现半边折叠以执行增量重新网格化。我正在处理流形网格。考虑以下简单网格: 目标是将 a 折叠成 b。 然而,在这种情况下,这会导致非流形网格 我想阻止。我的问题是: 我怎样才能提前做到这
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在考虑为我的应用使用 Firebase Analytics。我很好奇: 保留的标准是什么?保留是否跟踪具有我必须发送的唯一 ID 或唯一设备的用户帐户? 如果用户从多个设备登录到我的应用程序,我将
我想测试一个“withCriteria”闭包,但不知道如何去做。我看到了如何模拟 withCriteria 调用,但没有测试闭包中的代码。在运行执行“withCriteria”的测试时,我不断收到 M
如何从以下 sql 创建 Hibernate 条件查询? String hql = "select e.employeeId,m.meetingId,e.firstname from Employee
我担心我可能已经表达了我的previous question很糟糕,所以为了清楚起见,我重新开始。 想象许多表,每个表之间存在 OneToMany 关联; 农场 -> 田地 -> RegionGrou
我将如何使用条件 API 执行以下 Hibernate 查询。我有一个对象 Parent 和 List Children。我想搜索所有 parent 并找到哪些 parent 包含指定的 child
我正在使用 Oracle,目前无法实现我需要的查询。 假设我有下表: - ID Date Type Value - 1 01/12/2016 prod 1 - 2
有没有办法用 JPA 2 CriteriaBuilder 编写与以下查询等效的内容? select * from season s1 where end = ( select max(end)
背景 我们定期对多个项目进行测试,并产生测试结果(通过或失败)。单个测试可以应用于多个项目,单个项目可以对其进行多个不同的测试。 我们需要做的是生成当前未通过测试的所有项目/测试组合的列表,以及自上次
SQL: String hql1 = "SELECT /* PARALLEL(MVR,16) PARALLEL(MVRS,16)*/ * FROM ICM MINUS SELECT I1.* FRO
为什么这是不可能的? Criteria crit1 = sess.createCriteria(Criteria1Class.class); Criteria crit2 = crit1.creat
我通常在 hibernate 状态下使用 criteria.addOrder(Order.desc("myField")); 如何在不使用 hsql 的情况下在 Hibernate 中编写此语句? s
假设我有一个具有以下值的表 Plan。 planName(VARCHAR2) | validFrom(timestamp) | validTo(timestamp) -----------------
给定映射的 hibernate 类: @Entity public class MyTestClass { /* id and stuff */ private Integer aValue;
我是一名优秀的程序员,十分优秀!