Как выполнить запрос диапазона для поля типа LocalTime, которые были преобразованы в тип Integer - PullRequest
0 голосов
/ 14 апреля 2019

Я создал 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.Спасибо.

...