Java 使用ObjectBox查询本地时间

Java 使用ObjectBox查询本地时间,java,localtime,objectbox,Java,Localtime,Objectbox,我有两个问题 如何使用ObjectBox保存LocalTime rage,例如: 类LocalTimeRage{ 本地时间打开; 本地时间关闭; } 二,。如何使用ObjectBox查询本地时间范围,例如,查询与打开和关闭本地时间值匹配的对象,例如,查询在LocalTime中在上午7:00到晚上8:00之间打开和关闭的对象,因为ObjectBox将返回打开和关闭时间与范围匹配的对象。这基于ObjectBox v2.8.1 ObjectBox支持的对象列表相对有限。该列表不包括任何现代java.t

我有两个问题

如何使用ObjectBox保存LocalTime rage,例如: 类LocalTimeRage{ 本地时间打开; 本地时间关闭; }
二,。如何使用ObjectBox查询本地时间范围,例如,查询与打开和关闭本地时间值匹配的对象,例如,查询在LocalTime中在上午7:00到晚上8:00之间打开和关闭的对象,因为ObjectBox将返回打开和关闭时间与范围匹配的对象。

这基于ObjectBox v2.8.1

ObjectBox支持的对象列表相对有限。该列表不包括任何现代java.time类,但我们可以使用ObjectBox

我认为最好完全避免使用Date类,因此本例将LocalDateTime值转换为Long。然而,Date是其内置支持的类型之一:

导入java.time.LocalTime; 导入io.objectbox.annotation.Entity; 导入io.objectbox.annotation.Id; 导入io.objectbox.annotation.Convert; 导入io.objectbox.converter.PropertyConverter; @实体 公共类LocalTimeRange{ @身份证 私人长id; @Convertconverter=LocalTimeConverter.class,dbType=Long.class 私人本地时间开放; @Convertconverter=LocalTimeConverter.class,dbType=Long.class 私人本地时间关闭; 公共静态类LocalTimeConverter实现PropertyConverter{ @凌驾 公共LocalTime convertToEntityPropertyLong数据库值{ 如果databaseValue==null{ 返回null; } 返回LocalTime.ofSecondOfDaydatabaseValue; } @凌驾 public Long convertToDatabaseValueLocalTime实体属性{ 如果entityProperty==null{ 返回null; } 长秒=entityProperty.getHour*60*60+ entityProperty.getMinute*60+ entityProperty.getSecond; 返回秒数; } } 公共LocalTimeRangeLong id{ this.id=id; } 公共LocalTimeRangelong id,LocalTime打开,LocalTime关闭{ this.id=id; this.opens=打开; this.closes=关闭; } 公共本地时间范围{ } //未显示getter和setter } 现在,我们可以创建和存储两个测试对象:

BoxStore store=MyObjectBox.builder.nameobjectbox-demo-db.build; Box=store.boxForLocalTimeRange.class; //从没有对象开始: box.query.build.remove; //添加两个对象: LocalTimeRange ltrOne=新的LocalTimeRange1, LocalTime.of9,30,0,//9:30:009:30am LocalTime.of10,15,0; box.putltrOne; LocalTimeRange ltrTwo=新的LocalTimeRange2, LocalTime.of10,05,0, LocalTime.of11,45,0; box.putltrTwo; 然后我们可以查询数据存储:

//这将找到两个对象: LocalTime testTime=LocalTime.of10,10,0; //这将找到第二个对象 //LocalTime testTime=LocalTime.of10,20,0; //将localtime转换为秒: 长秒=LocalTimeToSecondTestTime; List localTimeRanges=box.query .lessLocalTimeRange打开,秒 .greaterLocalTimeRange\关闭,秒 .build.find; 对于LocalTimeRange ltr:localTimeRanges{ System.out.printlnltr.toString; } 商店关门; -- 私有静态长LocalTimeToSecondLocalTime lt{ 返回lt.getHour*60*60+ lt.getMinute*60+ 第二中尉; } 查询运算符的可处理类型也受到限制:

less(LocalTimeRange_.opens, seconds)
在这里,秒是一个很长的时间段,因为没有一个查询操作符采用我们想要使用的LocalTime的Java类型

您可能希望改进我的示例,以确保正确处理正好落在某个边界值上的测试时间,例如,query方法不小于或等于。您可以使用equal、and、or等构建更复杂的查询


这种方法将本地时间处理到最接近的秒。如果希望精度达到亚秒级,则需要更新逻辑以包含LocalTime对纳秒的支持。

这是基于ObjectBox v2.8.1

ObjectBox支持的对象列表相对有限。该列表不包括任何现代java.time类,但我们可以使用ObjectBox

我认为最好完全避免使用Date类,因此本例将LocalDateTime值转换为Long。然而,Date是其内置支持的类型之一:

导入java.time.LocalTime; 导入io.objectbox.annotation.Entity; 导入io.objectbox.annotation.Id; 导入io.objectbox.annotation.Convert; 导入io.objectbox.converter.PropertyConverter; @实体 公共类LocalTimeRange{ @身份证 私人长id; @Convertconverter=LocalTimeConverter.class,dbType=Long.class 私人本地时间开放; @Convertconverter=LocalTimeConverter.class,dbType=Long.class 私人本地时间关闭; 公共静态类LocalT imeConverter实现PropertyConverter{ @凌驾 公共LocalTime convertToEntityPropertyLong数据库值{ 如果databaseValue==null{ 返回null; } 返回LocalTime.ofSecondOfDaydatabaseValue; } @凌驾 public Long convertToDatabaseValueLocalTime实体属性{ 如果entityProperty==null{ 返回null; } 长秒=entityProperty.getHour*60*60+ entityProperty.getMinute*60+ entityProperty.getSecond; 返回秒数; } } 公共LocalTimeRangeLong id{ this.id=id; } 公共LocalTimeRangelong id,LocalTime打开,LocalTime关闭{ this.id=id; this.opens=打开; this.closes=关闭; } 公共本地时间范围{ } //未显示getter和setter } 现在,我们可以创建和存储两个测试对象:

BoxStore store=MyObjectBox.builder.nameobjectbox-demo-db.build; Box=store.boxForLocalTimeRange.class; //从没有对象开始: box.query.build.remove; //添加两个对象: LocalTimeRange ltrOne=新的LocalTimeRange1, LocalTime.of9,30,0,//9:30:009:30am LocalTime.of10,15,0; box.putltrOne; LocalTimeRange ltrTwo=新的LocalTimeRange2, LocalTime.of10,05,0, LocalTime.of11,45,0; box.putltrTwo; 然后我们可以查询数据存储:

//这将找到两个对象: LocalTime testTime=LocalTime.of10,10,0; //这将找到第二个对象 //LocalTime testTime=LocalTime.of10,20,0; //将localtime转换为秒: 长秒=LocalTimeToSecondTestTime; List localTimeRanges=box.query .lessLocalTimeRange打开,秒 .greaterLocalTimeRange\关闭,秒 .build.find; 对于LocalTimeRange ltr:localTimeRanges{ System.out.printlnltr.toString; } 商店关门; -- 私有静态长LocalTimeToSecondLocalTime lt{ 返回lt.getHour*60*60+ lt.getMinute*60+ 第二中尉; } 查询运算符的可处理类型也受到限制:

less(LocalTimeRange_.opens, seconds)
在这里,秒是一个很长的时间段,因为没有一个查询操作符采用我们想要使用的LocalTime的Java类型

您可能希望改进我的示例,以确保正确处理正好落在某个边界值上的测试时间,例如,query方法不小于或等于。您可以使用equal、and、or等构建更复杂的查询


这种方法将本地时间处理到最接近的秒。如果希望精度达到亚秒级,则需要更新逻辑以包含LocalTime对纳秒的支持。

LocalTimeRange是对象的属性/字段时如何?例如,class{List schedules;}class Schedule{String day;LocalTimeRange打开;LocalTimeRange关闭;}我不知道如何使用转换器来实现Schedule类,因为需要将每个属性映射到一个且仅一个受支持的内置类型。此外,对于列表示例,文档建议您可以将字符串列表转换为JSON数组,从而为数据库生成单个字符串。现在看来,我们不再存储对象,而是存储文档。我想一定有办法用物体来做这一切。。。也许这需要一个新问题?来自docs:contains仅适用于字符串,因此查询属性计划是否包含给定计划可能无法完全工作,因为它不是字符串文字和自定义类/对象。这如何?LocalTimeRange是对象的属性/字段时如何?例如,class{List schedules;}class Schedule{String day;LocalTimeRange打开;LocalTimeRange关闭;}我不知道如何使用转换器来实现Schedule类,因为需要将每个属性映射到一个且仅一个受支持的内置类型。此外,对于列表示例,文档建议您可以将字符串列表转换为JSON数组,从而为数据库生成单个字符串。现在看来,我们不再存储对象,而是存储文档。我想一定有办法用物体来做这一切。。。也许这需要一个新问题?来自docs:contains仅适用于字符串,因此查询属性计划是否包含给定计划可能无法完全工作,因为它不是字符串文字和自定义类/对象。这如何?