我有两个问题,
class LocalTimeRage {
LocalTime opens;
LocalTime closes;
}以及2.如何使用ObjectBox查询本地时间范围,例如,在opens和closes LocalTime值中匹配的查询对象,例如,查询在上午07:00之间打开到晚上8:00关闭(在LocalTime中),因为ObjectBox将返回具有与范围匹配的打开和关闭时间的对象。
发布于 2020-12-12 22:53:39
这是基于ObjectBox v2.8.1的。
ObjectBox支持相对有限的内建类型列表。该列表不包括任何现代java.time类,但我们可以使用ObjectBox 注解。
我认为最好完全避免老生常谈 Date类,因此这个示例将LocalDateTime值转换为longs (然而,Date是它们支持的内置类型之一):
import java.time.LocalTime;
import io.objectbox.annotation.Entity;
import io.objectbox.annotation.Id;
import io.objectbox.annotation.Convert;
import io.objectbox.converter.PropertyConverter;
@Entity
public class LocalTimeRange {
@Id
private long id;
@Convert(converter = LocalTimeConverter.class, dbType = Long.class)
private LocalTime opens;
@Convert(converter = LocalTimeConverter.class, dbType = Long.class)
private LocalTime closes;
public static class LocalTimeConverter implements PropertyConverter<LocalTime, Long> {
@Override
public LocalTime convertToEntityProperty(Long databaseValue) {
if (databaseValue == null) {
return null;
}
return LocalTime.ofSecondOfDay(databaseValue);
}
@Override
public Long convertToDatabaseValue(LocalTime entityProperty) {
if (entityProperty == null) {
return null;
}
long seconds = (entityProperty.getHour() * 60 * 60) +
(entityProperty.getMinute() * 60) +
entityProperty.getSecond();
return seconds;
}
}
public LocalTimeRange(Long id) {
this.id = id;
}
public LocalTimeRange(long id, LocalTime opens, LocalTime closes) {
this.id = id;
this.opens = opens;
this.closes = closes;
}
public LocalTimeRange() {
}
// getters and setters not shown
}现在我们可以创建和存储几个测试对象:
BoxStore store = MyObjectBox.builder().name("objectbox-demo-db").build();
Box<LocalTimeRange> box = store.boxFor(LocalTimeRange.class);
// start with no objects:
box.query().build().remove();
// add two objects:
LocalTimeRange ltrOne = new LocalTimeRange(1,
LocalTime.of(9, 30, 0), //9:30:00 (9:30am)
LocalTime.of(10, 15, 0));
box.put(ltrOne);
LocalTimeRange ltrTwo = new LocalTimeRange(2,
LocalTime.of(10, 05, 0),
LocalTime.of(11, 45, 0));
box.put(ltrTwo);然后我们可以查询数据存储:
// this will find both objects:
LocalTime testTime = LocalTime.of(10, 10, 0);
// this will find the 2nd object
//LocalTime testTime = LocalTime.of(10, 20, 0);
// convert the localtime to seconds:
Long seconds = localTimeToSeconds(testTime);
List<LocalTimeRange> localTimeRanges = box.query()
.less(LocalTimeRange_.opens, seconds)
.greater(LocalTimeRange_.closes, seconds)
.build().find();
for (LocalTimeRange ltr : localTimeRanges) {
System.out.println(ltr.toString());
}
store.close();
---
private static long localTimeToSeconds(LocalTime lt) {
return (lt.getHour() * 60 * 60) +
(lt.getMinute() * 60) +
lt.getSecond();
}查询运算符在它们能够处理的类型中也受到限制:
less(LocalTimeRange_.opens, seconds)在这里,seconds是一个long --因为没有采用我们想要使用的long类型的查询操作符(LocalTime)。
您可能希望改进我的示例,以确保正确地处理掉在其中一个边界值上的测试时间(例如,没有“小于或等于”查询方法)。您可以使用equal()、and()、or()等构建更复杂的查询。
(此方法将LocalTime处理到最近的秒。如果您希望获得亚秒级的精度,则需要更新逻辑以包括LocalTime对纳秒的支持。)
https://stackoverflow.com/questions/65263595
复制相似问题