250 Часть II. Типовые решения
// не являющихся простыми числовыми
protected void loadFindStatement(Key key, PreparedStatement
finder) throws SQLException {
finder.setLong(1, key.longValue());
}
В приведенном коде не было реализовано построение SQL-выражения, потому что в
зависимости от типа ключа в него нужно передавать разное количество параметров. Таб-
лица пунктов заказов имеет составной ключ, поэтому метод findStatementstring
должен быть переопределен в классе LineltemMapper.
class LineltemMapper...
public Lineltem find(long orderlD, long seq) {
Key key = new Key(new Long(orderlD), new Long(seq));
return (Lineltem) abstractFind(key);
} public Lineltem find(Key key) {
return (Lineltem) abstractFind(key); }
protected String findStatementString() {
return
"SELECT orderlD, seq, amount, product " +
FROM line_iterns " +
WHERE (orderlD = ?) AND (seq = ?)";
}
// переопределение метода загрузки
// параметров для составных ключей
protected void loadFindStatement(Key key, PreparedStatement
finder) throws SQLException {
finder.setLong(1, orderlD(key));
finder.setLong(2, sequenceNumber (key));
)
// вспомогательные методы для извлечения элементов ключа
private static long orderlD(Key key) {
return key.longValue(0); } private static
long sequenceNumber(Key key) {
return key.longValue(1); }
Помимо предоставления SQL-выражения и определения интерфейса для методов по-
иска, в производном классе следует переопределить метод загрузки параметров SQL-
запроса, чтобы в соответствующее выражение можно было передать два параметра. Кро-
ме того, я написал два вспомогательных метода, предназначенных для извлечения частей
ключа. Это сделано для того, чтобы не описывать в теле метода loadFindStatement О
явный доступ к элементам ключа с указанием их номеров в массиве полей. Использова-
ние явных номеров — признак дурного тона.
Выполнение загрузки также разбито на две части: стандартное поведение для простых
числовых ключей реализовано в супертипе слоя и переопределено в производных классах
с более сложными ключами. В нашем примере загрузка объекта заказа выглядит, как по-
казано далее.