Из Spring Data JPA 1.10 есть еще один вариант для этого: Query By Example . Ваш репозиторий должен реализовывать помимо JpaRepository
также интерфейс QueryByExampleExecutor , где вы получаете такие методы, как:
Iterable findAll(Example example)
Затем вы создаете пример для поиска например:
Employee e = new Employee();
e.setEmployeeNumber(getEmployeeNumberSomewherFrom());
e.setName(getNameSomewhereFrom());
e.setMarried(getMarriedSomewhereFrom());
e.setProfession(getProfessionSomewhereFrom());
e.setDateOfBirth(getDateOfBirthSomewhereFrom());
, а затем:
employeeRepository.findAll(Example.of(e));
Если некоторые параметры равны нулю, они не будут приняты в предложение WHERE, поэтому вы получите динамические запросы.
Чтобы уточнить соответствие атрибутов String, просмотрите ExampleMatcher
. А ExampleMatcher
, который делает регистр без учета регистра like
, например:
ExampleMatcher matcher = ExampleMatcher.matching().
withMatcher("profession", ExampleMatcher.GenericPropertyMatcher.of(ExampleMatcher.StringMatcher.CONTAINING).ignoreCase());
Примеры QBE: https://github.com/spring-projects/spring-data-examples/tree/master/jpa/query-by-example
Вы были так близко
Dim ctrl As Control
Dim ws As Worksheet
Set ws = Sheets("Splits")
erow = ws.Cells(Rows.Count, 1).End(x1Up).Offset(1, 0)
ws.Cells(erow, 1) = OriginalTourCode.Text
ws.Cells(erow, 2) = OriginalStartDate.Text
ws.Cells(erow, 3) = OriginalEndDate.Text
ws.Cells(erow, 4) = NewTourCode1.Text
ws.Cells(erow, 5) = NewStartDate1.Text
ws.Cells(erow, 6) = NewEndDate1.Text
ws.Cells(erow, 7) = NewTourCode2.Text
ws.Cells(erow, 8) = NewStartDate2.Text
ws.Cells(erow, 9) = NewEndDate2.Text
ws.Cells(erow, 10) = ReasonForSplit.Text
End Sub
Конечным параметром является xlUp
, а не x1Up
.
Option Explicit
Private Sub SplitTourCommand_Click()
Const cSheet As String = "Splits"
Dim erow As Long
Dim vnt As Variant
ReDim vnt(1 To 1, 1 To 10) As String
vnt(1, 1) = OriginalTourCode.Text
vnt(1, 2) = OriginalStartDate.Text
vnt(1, 3) = OriginalEndDate.Text
vnt(1, 4) = NewTourCode1.Text
vnt(1, 5) = NewStartDate1.Text
vnt(1, 6) = NewEndDate1.Text
vnt(1, 7) = NewTourCode2.Text
vnt(1, 8) = NewStartDate2.Text
vnt(1, 9) = NewEndDate2.Text
vnt(1, 10) = ReasonForSplit.Text
With Worksheets(cSheet)
erow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(erow, 1).Resize(, 10) = vnt
End With
End Sub
Option Explicit
Private Sub SplitTourCommand_Click()
Const cSheet As String = "Splits"
Dim erow As Long
With Worksheets(cSheet)
erow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(erow, 1) = OriginalTourCode.Text
.Cells(erow, 2) = OriginalStartDate.Text
.Cells(erow, 3) = OriginalEndDate.Text
.Cells(erow, 4) = NewTourCode1.Text
.Cells(erow, 5) = NewStartDate1.Text
.Cells(erow, 6) = NewEndDate1.Text
.Cells(erow, 7) = NewTourCode2.Text
.Cells(erow, 8) = NewStartDate2.Text
.Cells(erow, 9) = NewEndDate2.Text
.Cells(erow, 10) = ReasonForSplit.Text
End With
End Sub
erow = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
В вашем коде было 2 ошибки. Во-первых, команда xlUp
, а не x1Up
- «xl» означает «Excel», а не «X One» - это прекрасный пример того, почему вы почти всегда должны использовать Option Explicit
[119 ]
Второе: ваш код как есть попытается поместить .Value
из ячейки в нетипизированную переменную erow
- поскольку ячейка пуста (так как ячейка ниже последней ячейка с данными), это означает, что erow
будет всегда будет 0
. И строка 0 не существует для помещения данных.
Вместо этого, используя Range.Row
, мы получаем следующий номер строки для вставки данных в