찾다

 >  Q&A  >  본문

java - 复杂的字段条件判断解析

应用场景简化描述

现在有个用户Person,包含int age, BigDecimal money,java.util.Date accessTime等字段,对应于用户表person:

年龄(age : int) 资产 (money : number) 入网日期 (accessTime : date)
20 100.00 2017-03-24
20 150.00 2016-05-07
21 300.00 2015-04-03
21 240.00 2015-07-15
22 300.00 2014-12-21
21 300.00 2014-12-21

另外,有一张条件表,condition:

字段名(fieldName : varchar) 运算符(oper : varchar) 阈值 (threshold : varchar )
age = 21
money > 280.05
accessTime > 2015-05-31

条件表condition用来配置过滤用户person的条件,表示要过滤出

的所有用户。

其中,oper可取的值有 = , < , > , >= , <= , in , between

如果oper为inbetween, 则阈值为多个,用逗号隔开。

问题

现在,对于不同的字段,在条件表condition里都是varchar类型,而在person表中,却有不同的类型。

而且,条件表里的条件是从web系统页面上,由用户配置的;也就是说,条件的个数不确定,配置的字段,运算符,阈值也都是不确定的。

问: 如何才能使用java代码,先将所有用户以及条件查出来,然后遍历每个用户,对于每个用户,遍历每个条件,怎样才能正确的判断该用户通过所有的条件检查,得出通过条件筛选的用户列表?(上边的场景是实际场景简化后的,请不要给出拼接sql,通过sql过滤的答案)


是不是可以把person的记录生成xml文件,条件生成xsd文件,用xsd去校验xml ??

PHPzPHPz2803일 전539

모든 응답(3)나는 대답할 것이다

  • 高洛峰

    高洛峰2017-04-18 10:54:25

    SQL을 사용하지 않는 경우 책임 사슬 모델을 사용하여 모든 데이터를 가져와서 링크 목록에 넣는 것을 고려할 수 있습니다.
    그런 다음 컬렉션의 콘텐츠를 필터링하는 필터를 작성할 수 있습니다. 필터와 동일함

    회신하다
    0
  • 怪我咯

    怪我咯2017-04-18 10:54:25

    사용자 테이블이 얼마나 큰지 모두 알아보세요.

    정식적인 방법은 SQL을 이용하여 확인하는 것입니다. . .

    더 발전된 접근 방식은 도메인별 언어를 사용자 정의한 다음 이를 SQL로 변환하는 것입니다. 어차피 XML 필터링을 사용할 수는 없습니다.

    회신하다
    0
  • ringa_lee

    ringa_lee2017-04-18 10:54:25

    당신의 condition表이 아무 소용이 없는 것 같나요? 데이터만 저장하나요? json을 이용해 임시로 넘겨줄 수 있으면 더 좋을 것 같습니다. 지속적으로 저장하려면 최소한 admin_id이나 필터링 조건을 사용하는 표시가 있어야 합니다. redis에 직접 넣는 것보다 효율성이 떨어지는 것 같습니다.

    당신은 Java를 사용하는 것 같은데 저는 PHP를 사용하는 것이 익숙하기 때문에 PHP를 사용하는 방법에 대해 간략하게 설명하겠습니다...

    Filter类condition로 변환하려면 sql을 작성하세요.

    으아악

    손으로 직접 작성, 문법 오류는 무시해주세요...

    회신하다
    0
  • 취소회신하다