Будьте в спящем режиме: Как установить ПУСТОЕ значение параметра запроса с HQL?

как я могу установить Быть в спящем режиме Параметр на "пустой указатель"? Пример:

Query query = getSession().createQuery("from CountryDTO c where c.status = :status  and c.type =:type")
.setParameter("status", status, Hibernate.STRING)
.setParameter("type", type, Hibernate.STRING);

В моем случае строка состояния может быть пустой. Я отладил это и в спящем режиме, затем генерирует строку/запрос SQL как это....status = null... Это однако не Работает в MySQL, как корректный SQL-оператор должен быть"status is null"(Mysql не понимает status=null и оценивает это ко лжи так, чтобы никакие записи никогда не возвращались для запроса, согласно mysql документам, которые я прочитал...),

Мои вопросы:

  1. Почему не делает Hibernate переведите пустую строку правильно в, "является пустым" (и скорее и неправильно создает "=null")?

  2. Что лучший способ состоит в том, чтобы переписать этот запрос так, чтобы это было пустым безопасным? С nullsafe я подразумеваю, что в случае, что Строка "состояния" является пустой, чем он, должен создать, "является пустым"?

Большое спасибо! Tim

57
задан cнŝdk 21 July 2015 в 10:40
поделиться

4 ответа

  1. Я считаю, что Hibernate сначала переводит ваш запрос HQL на SQL, и только после этого он пытается связать ваши параметры. Это означает, что он не сможет переписать запрос из PARAL =? на param - это нулевой .

  2. Попробуйте использовать API-критерии:

     критерии C = SEASIT.CREATECRITERIA (countrydto.class);
    c.add (ограничения .eq («тип», тип));
    c.add (status == null? Ограничения .isnull («Статус»): ограничения .eq («Статус», Статус));
    Результат списка = C.List ();
     
39
ответ дан 24 November 2019 в 19:36
поделиться

Кажется, что вы должны использовать - это нулевой в HQL, (который может привести к сложным перестановкам, если есть более одного параметра с нулевым потенциалом.) Но вот Возможное решение:

String statusTerm = status==null ? "is null" : "= :status";
String typeTerm = type==null ? "is null" : "= :type";

Query query = getSession().createQuery("from CountryDTO c where c.status " + statusTerm + "  and c.type " + typeTerm);

if(status!=null){
    query.setParameter("status", status, Hibernate.STRING)
}


if(type!=null){
    query.setParameter("type", type, Hibernate.STRING)
}
5
ответ дан 24 November 2019 в 19:36
поделиться

Я не пробовал это, но что происходит, когда вы используете : статус дважды, чтобы проверить NULL ?

Query query = getSession().createQuery(
     "from CountryDTO c where ( c.status = :status OR ( c.status IS NULL AND :status IS NULL ) ) and c.type =:type"
)
.setParameter("status", status, Hibernate.STRING)
.setParameter("type", type, Hibernate.STRING);
4
ответ дан 24 November 2019 в 19:36
поделиться

Имеется два выборе:

Option 1: Используйте утилиту svcutil.exe в командной строке. Его следует установить в каталог C :\Program Files\Microsoft SDK\Windows\v6.0A\Bin (или что-то подобное, в зависимости от компьютера и ОС)

Использовать svcutil -? для списка всех параметров. В основном, в самом простом виде, используйте

svcutil  (name of your service).wsdl (name of your datafile).xsd

и это создаст соответствующий файл (имя вашей службы) .cs C # с контрактами на обслуживание и данные, а также образец конфигурационного файла.

Результирующий файл * .cs (или * .vb, если вы хотите VB.NET) будет содержать контракт на обслуживание (методы, полученные из WSDL) и контракты на данные (часть данных, поступающая из XSD) для вашего сервиса.

Option 2: Используйте диалоговое окно «Add Service Reference» в Visual Studio (на узле «References» в обозревателе решений) и просто введите имя файла WSDL:

Add Service Reference dialog

Это создаст ссылку на службу, которая в основном совпадает с выводом утилиты svcutil.exe - плюс несколько heltil.exe

К сожалению, в обоих случаях импорт создаст ужасно перегруженный файл конфигурации, что, вероятно, является одной из причин, по которым многие программисты думают, что WCF ужасно сложен - на самом деле это не так, но эти два инструмента импорта просто делают ужасающе плохую работу по созданию базовой конфигурации для вас.... не позволяйте этому отпугнуть вас!

Если ссылка Add Service Reference для WSDL не преобразует автоматически все соответствующие и необходимые XSD-файлы, может потребоваться добавить их в проект, а затем использовать что-то вроде XSD2Code для преобразования их в классы C # (или VB.NET).

Файл wsdl.exe является устаревшей утилитой для преобразования файла WSDL в заглушку ASMX (ASP.NET webservice) - больше не используйте ее, используйте svcutil.exe или ссылку на добавление службы Visual Studio для WCF.

Что касается создания правильной и минимальной конфигурации WCF, проверьте телешоу № 122 DotNet Rocks с Мигелем Кастро под названием Extreme WCF . Мигель представляет отличный способ структурировать ваши проекты WCF, и создать столько конфигурации, сколько действительно необходимо (и, таким образом, можно понять намного лучше, чем порожденный беспорядок svcutil).

-121--3909829-

Если вы хотите иметь 100% рабочее решение для 32-разрядных внутренних платформ как на 32, так и на 64-разрядных платформах, то предлагаю использовать следующее решение:

function intval32bits($value)
{
    $value = ($value & 0xFFFFFFFF);

    if ($value & 0x80000000)
        $value = -((~$value & 0xFFFFFFFF) + 1);

    return $value;
}
-121--3444010-

Явным является javadoc для setParameter (Последовательность, Object) . Обидно, что он не создает исключения, если передается нулевое значение.

Альтернативой является setParameter (Последовательность, Object, Type) , который допускает значения null, хотя я не уверен, какой параметр Type является наиболее подходящим здесь.

13
ответ дан 24 November 2019 в 19:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: