Похоже, ваш запрос написан неправильно. Похоже, вы используете hibernate для получения списка объектов с помощью id деления. Попробуйте написать запрос следующим образом:
FROM District a WHERE a.division.id =:division
ID должен иметь тип Long.
query.setParameter("division", Long.parseLong(division));
Он должен работать именно так, как вы хотите.
Я не сказал бы, что класс consts не является Delphi путь. Это просто, они были представлены Delphi совсем недавно и большому количеству книг и статей, которые Вы найдете в Интернете, были записаны перед их введением, и таким образом Вы не будете видеть их широко используемый. Многие разработчики Delphi (я сказал бы, что большинство), начнет использовать Delphi, прежде чем они были сделаны доступными, и таким образом они не первая вещь, о которой каждый думает.
Объявление:
type
TMyValues = class
type TMyEnum = (myValue1, myValue2, myValue3, myValue4);
const MyStrVals: array [TMyEnum] of string =
('One', 'Two', 'Three', 'Four');
const MyIntVals: array [TMyEnum] of integer =
(1, 2, 3, 4);
end;
Использование:
if ClientDataSet_Field.AsInteger = TMyValues.MyIntVals[myValue1] then
Бросок обычно был бы моим последним выбором.
Одной вещью рассмотреть является назад совместимость - константы класса относительно в новинку для Delphi поэтому, если Ваш код должен быть с обеспечением совместного доступа с предыдущими версиями, чем они отсутствуют.
Я обычно использую перечислимые типы, с различием от Вашего то, что мое первое перечисление обычно является 'неопределенным' объектом для представления ПУСТОГО УКАЗАТЕЛЯ или 0 в международном поле.
TmyValues = (myvUndefined, myvDescription1, myvDescription2)
if ClientDataSet_Field.AsInteger = Ord(myvDescription1) then...
Для использования определенного ответа Jim McKeeth - если необходимо отобразить пользователю текст видимая версия, или если необходимо преобразовать их выделенный текст в перечислимый тип затем массив пригождается в conjuction с типом:
const MYVALS: array [TmyValues ] of string = ('', 'Description1', 'Description2');
У Вас могут затем быть служебные функции для устанавливания/получения перечислимого типа на строку:
Function MyValString(const pMyVal:TmyValues):string;
begin
result := MYVALS[Ord(pMyVal)];
end;
Function StringToMyVal(const pMyVal:String):TMyValues;
var i:Integer;
begin
result := myvUndefined;
for i := Low(MYVALS) to High(MYVALS) do
begin
if SameText(pMyVal, MYVALS[i]) then
begin
result := TMyValues(i);
break;
end;
end;
end;
Продвижение... у Вас может быть точечная стандартная программа для установки комбинации/поля списка:
Procedure SetList(const DestList:TStrings);
begin
DestList.Clear;
for i := Low(MYVALS) to High(MYVALS) do
begin
DestList.Insert(MYVALS[i]);
end;
end;
В коде: SetList (Combo1. Объекты) или SetList (ListBox1. Объекты)..
Затем, если Вы видите шаблон здесь... полезные служебные функции, окружающие Ваше перечисление, затем Вы добавляете все к своему собственному классу и помещаете этот класс в свою собственную единицу под названием MyValueEnumeration или whaterver. Вы заканчиваете со всем кодом, окружающим это перечисление в одном месте, и продолжаете добавлять служебные функции, поскольку Вам нужны они. Если Вы содержите единицу в чистоте - не смешиваются в другой несвязанной функциональности затем, это останется очень удобным для всех проектов, связанных с тем перечислением.
Вы будете видеть больше шаблонов с течением времени, и Вы используете ту же функциональность много раз, и Вы создадите лучшую мышеловку снова.
столько опций! :-) я предпочитаю перечисления и обычно использую их, как Вы описываете. одной из первых частей нравится, то, что я могу использовать их с "для" цикла. я действительно использую константы класса также, но предпочитаю перечисления (даже частные перечисления) в зависимости от того, чего я пытаюсь достигнуть.
TMyType=class
private const // d2007 & later i think
iMaxItems=1; // d2007 & later i think
private type // d2007 & later i think
TMyValues = (mvValue1 = 1, mvValue2 = 2); // d2007 & later i think
private
public
end;
Опция, о которой Вы не думали, состоит в том, чтобы использовать справочную таблицу в базе данных, и затем можно проверить по строке в базе данных.
например.
Select value, Description from tbl_values inner join tbl_lookup_values where tbl_values.Value = tbl_lookup_values.value
if ClientDataSet_Field.AsString = 'ValueIwant' then