Я работаю над проектом весенней загрузки. У меня есть веб-служба, которая ищет текст в нескольких полях. Я использую спецификацию Java для генерации запроса.
Результирующий запрос такой
select *
from V_AGENCY agencyview0_
where
agencyview0_.nationcode like '%ABCDEFGHIKLMN%
or agencyview0_.username like '%ABCDEFGHIKLMN%'
Проблема в том, что я получаю исключение java.sql.DataTruncation: Data truncation, потому что поле nationcode имеет допустимую длину 10 в базе данных. Почему я получаю это исключение? Я не пытаюсь вставить значение в это поле.
Класс org.firebirdsql.jdbc.field.FBWorkaroundStringField выдает эту ошибку.
public void setString(String value) throws SQLException {
byte[] data = this.setStringForced(value);
if (value != null) {
assert data != null : "Expected non-null data here";
if (data.length > this.fieldDescriptor.getLength() && !this.isSystemTable(this.fieldDescriptor.getOriginalTableName()) && (value.length() > this.fieldDescriptor.getLength() + 2 || value.charAt(0) != '%' && value.charAt(value.length() - 1) != '%')) {
throw new DataTruncation(this.fieldDescriptor.getPosition() + 1, true, false, data.length, this.fieldDescriptor.getLength());
}
}
}
ОБНОВЛЕНИЕ: добавлены коды Spring Boot
Контроллер:
@GetMapping(value = {PATH_SEARCH, PATH_LIST, PATH_VIEW + "/" + PATH_SEARCH, PATH_VIEW + "/" + PATH_LIST}, params = {PARAM_TEXT, PARAM_FIELD})
public List<T> searchInMultipleFields(
@RequestParam(name = PARAM_START, required = false) String start,
@RequestParam(name = PARAM_LIMIT, required = false) String limit,
@RequestParam(name = PARAM_TEXT) String text,
@RequestParam(name = PARAM_FIELD) List<String> fields
) {
OoSpecificationsBuilder<T> builder = new MultipleSearchSpecificationBuilder<>();
for (String field : fields) {
builder.with(field, ":", text.toUpperCase());
}
Specification<T> spec = builder.build();
return mService.getAll(getValueOf(start), getValueOf(limit, MAX_PAGE_SIZE), spec);
}
Обслуживание:
@Override
public List<T> getAll(int aStart, int aSize, Specification<T> aSpec) {
return getRepository().findAll((Specification) aSpec, generatePageRequest(aStart, aSize)).getContent();
}
JpaSpecificationExecutor:
Page<T> findAll(@Nullable Specification<T> var1, Pageable var2);
Технические характеристики:
public class MultipleSearchSpecification<T extends BaseModel> implements Specification<T> {
private SearchCriteria criteria;
public MultipleSearchSpecification(SearchCriteria aCriteria) {
criteria = aCriteria;
}
@Override
public Predicate toPredicate
(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
if (root.get(criteria.getKey()).getJavaType() == String.class) {
return builder.like(
root.get(criteria.getKey()), "%" + criteria.getValue() + "%");
}
return null;
}}
Знаете ли вы какой-либо обходной путь для этой проблемы?
like ?
и настройки вместо этого значение параметра). - person Mark Rotteveel   schedule 12.07.2018MultipleSearchSpecificationBuilder
(или, если оно не является частью стандартной пружины: каков его код)? - person Mark Rotteveel   schedule 17.07.2018