Либо используйте globstar вашей оболочки (который выполняет рекурсивный поиск) 1,2:
shopt -s globstar
git diff -- *.py **/*.py
, либо используйте find: find -name '*.py' -print0 | xargs -0 git diff --
Оба они являются специальными именами и пробелами. Хотя вы можете захотеть отфильтровать каталоги с расширением .py :) 1 Мне нравится делать git diff -- {.,**}/*.py
обычно 2 Когда globstar включен, git diff -- **/*.py
уже включает ./*.py
. В man-странице Bash: «Если за ним следует /, два соседних * s будут соответствовать только каталогам и подкаталогам». @Column
имеет атрибут length
, который можно использовать для установки длины столбца, это приведет к исключению SQL при вставке значения большей длины. И вы можете использовать @Size(max=SOME_VALUE)
для проверки бина.
@Entity
public class MyEntity {
@Size(max=10)
@Column(name = "field", nullable = false, length = 10)
private String field;
}
Я создал небольшой служебный класс, чтобы решить именно эту проблему.
public class HibernateValidator {
private ConcurrentHashMap<Class, List<FieldConstraint>> constraints = new ConcurrentHashMap<>();
public List<ValidationViolation> validate(Object entity) {
List<FieldConstraint> constraints = getFieldConstraints(entity);
return constraints.stream()
.flatMap(x -> validate(entity, x))
.collect(Collectors.toList());
}
private Stream<ValidationViolation> validate(Object entity, FieldConstraint x) {
String value;
try {
x.getField().setAccessible(true);
value = (String) x.getField().get(entity);
} catch (IllegalAccessException e) {
throw new RuntimeException("Can't get value", e);
}
if (value != null && value.length() > x.getSize()) {
return Stream.of(ValidationViolation.builder()
.fieldName(x.getField().getName())
.build());
} else {
return Stream.empty();
}
}
private List<FieldConstraint> getFieldConstraints(Object entity) {
return constraints.computeIfAbsent(entity.getClass(),
clazz -> Stream.of(clazz.getDeclaredFields())
.filter(x -> x.getType().equals(String.class))
.flatMap(x -> {
Column annotation = x.getAnnotation(Column.class);
if (annotation == null) {
return Stream.empty();
} else {
return Stream.of(FieldConstraint.builder()
.field(x)
.size(annotation.length())
.build());
}
})
.collect(Collectors.toList()));
}
@Data
@Builder
public static class ValidationViolation {
private final String fieldName;
}
@Data
@Builder
private static class FieldConstraint {
private final Field field;
private final int size;
}
}
Используйте валидацию bean-компонента :
@Entity
public class MyEntity {
@Size(max = 10)
@Column(name = "field", nullable = false, length = 10)
private String field;
}
Или можно использовать аннотации, специфичные для спящего режима @Length(max = 10)
.
Затем вы можете проверить сущность с помощью объекта validator :
public class DemoApplication {
public static void main(String[] args) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
MyEntity myEntity = new MyEntity();
Set<ConstraintViolation<MyEntity>> constraintViolations = validator.validate(myEntity));
}
}