Я создал TimeConverter, который расширяет AttributeConverter.TimeConverter конвертирует LocalTime в Integer и реализует TwoWayFieldBridge.
в базе данных LocalTime = 12:23 был сохранен как 1223. Ниже приведен пример:
- 09: 23 -> 923
- 00: 42 -> 42
В конце концов, я хочу использовать Hibernate Search для получения документов, для которых целое число удовлетворяет условию над открытым полем и ниже закрытого поля из класса RangeTime.
@Converter
public class TimeConverter implements AttributeConverter<LocalTime, Integer>, TwoWayFieldBridge {
@Override
public Integer convertToDatabaseColumn(LocalTime localTime) {
if (localTime == null) {
return null;
}
return localTimeToInt(localTime);
}
@Override
public LocalTime convertToEntityAttribute(Integer integer) {
if (integer == null) {
return null;
}
StringBuilder s = new StringBuilder(integer.toString());
for (int i = integer.toString().length(); i < 4; i++) {
s.insert(0, '0');
}
StringBuilder stringBuilder = new StringBuilder(s.toString());
stringBuilder.insert(2, ":");
return LocalTime.parse(stringBuilder);
}
@Override
public Object get(String name, Document document) {
String value = document.get(name);
return Integer.valueOf(value);
}
@Override
public String objectToString(Object object) {
return String.valueOf(object);
}
@Override
public void set(String name, Object value, Document document, LuceneOptions luceneOptions) {
if (value == null) {
return;
}
LocalTime localTime = (LocalTime) value;
luceneOptions.addNumericDocValuesFieldToDocument(name, localTimeToInt(localTime), document);
}
private int localTimeToInt(LocalTime localTime) {
return localTime.getHour() * 100 + localTime.getMinute();
}
}
@Entity
@Table
@Data
@EqualsAndHashCode
@Indexed
public class RangeTime {
...
@Column
@Convert(converter = TimeConverter.class)
@JsonFormat(pattern = "HH:mm")
@Field
@FieldBridge(impl = TimeConverter.class)
private LocalTime open;
@Column
@Convert(converter = TimeConverter.class)
@JsonFormat(pattern = "HH:mm")
@Field
@FieldBridge(impl = TimeConverter.class)
private LocalTime close;
}
//value is integer: 22, 2243, 1240
open = qb.range().onField("place.monday.rangeTime.open)
.above(value)
.createQuery();
close = qb.range().onField("place.monday.rangeTime.close)
.below(value)
.createQuery();
bool.must(open).must(close);
Понятия не имею, как решить эту проблему.Я думаю, что проблема заключается в неправильном BridgeField.Спасибо.