Spring Mongodb使用范围标准

时间:2017-03-31 02:35:09

标签: spring mongodb spring-data-mongodb

我有一些关于员工的数据,这些数据存储了名字和姓氏等等典型信息......我给出的商业案例要求我根据名字,最后一个标准为员工提取记录。名字和dob。

起初我觉得这很容易,但在db中搜索之后,我发现dob记录有不同的时间戳(这没有意义)。如果没有涉及解决这个问题的内部公司问题,我需要我的查询来查看具有白天开始和日期结束范围的dob。

下面的示例代码演示了我最近解决此问题的努力,但未能将结果与我在db中看到的结果相匹配。此代码使用Spring Mongodb Query和mongoDbTemplate构建查询。我真的可以帮助找出这个。

我必须设置一个日期范围,以确保我获得当天的员工,但无法弄清楚如何正确构建查询。

示例方法:

    @Slf4j
    @Repository
    public class EmployeeDao {

        private static final int START_OF_DAY = 0;
        private static final int END_OF_DAY = 1;

        @Getter private MongoTemplate mongoTemplate; 

        @Autowired 
        public void setMongoTemplate(MongoTemplate mongoTemplate) {

            DB db = mongoTemplate.getDb();
            mongoTemplate = new MongoTemplate(db.getMongo(), "EmployeeDB");
            this.mongoTemplate = mongoTemplate;
        }

        public List<Employee> findEmployeeByNameIdDobRange(String lName, String fName, Date dob){

            DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
            String startFmt = df.format(convertTo(dob, START_OF_DAY));
            String endFmt = df.format(convertTo(dob, END_OF_DAY));

            Query q = new Query();
            q.addCriteria(Criteria.where("employee.firstName").regex(fName, "i")
                    .and("employee.lastName").regex(lName, "i")  
                    .andOperator(
               Criteria.where("employee.dob").gte(startFmt).lte(endFmt) 
                )
            );

            return return getMongoTemplate().find(q, Employee.class);
        }

        private Date convertTo(Date dt, int startOrEnd){

            Calendar cal = Calendar.getInstance();
            cal.setTime(dt);

            switch (startOrEnd) {
                case END_OF_DAY:
                    cal.set(Calendar.HOUR_OF_DAY, 23);
                    cal.set(Calendar.MINUTE, 59);
                    cal.set(Calendar.SECOND, 59);
                    cal.set(Calendar.MILLISECOND, 999);
                    break;
                case START_OF_DAY:
                    cal.set(Calendar.HOUR_OF_DAY, 0);
                    cal.set(Calendar.MINUTE, 1);
                    cal.set(Calendar.SECOND, 1);
                    cal.set(Calendar.MILLISECOND, 1);
                    break;
                default:
                    throw new IllegalArgumentException("starOrEnd paramter does not equal 0 for beggining or 1 for end of day");
            }
            log.info(cal.toString());
            return cal.getTime();
        }

我感谢任何可以提出的建议。谢谢!

0 个答案:

没有答案