RSS Feed


Detached-критерия без проекции в подзапросе выдает NPE

Обнаружилось, что detached-критерии использующиеся в подзапросах не работоспособны без проекций. Лично мне кажется, что критерия без проекции должна возвращать список объектов класса, над которым она построена (на уровне SQL-запроса – список идентификаторов).

DetachedCriteria postsCriteria = DetachedCriteria.forClass(Post.class).add(anyRestriction);

...
Subqueries.propertyIn("postId", postsCriteria)
...

Ошибка, которую выдаст hibernate выглядит так:

Caused by: java.lang.NullPointerException
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getProjectedTypes(CriteriaQueryTranslator.java:341)
at org.hibernate.criterion.SubqueryExpression.createAndSetInnerQuery(SubqueryExpression.java:153)
at org.hibernate.criterion.SubqueryExpression.toSqlString(SubqueryExpression.java:69)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:357)
at org.hibernate.loader.criteria.CriteriaJoinWalker.(CriteriaJoinWalker.java:113)
at org.hibernate.loader.criteria.CriteriaJoinWalker.(CriteriaJoinWalker.java:82)
at org.hibernate.loader.criteria.CriteriaLoader.(CriteriaLoader.java:91)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1578)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:306)
at ru.any.dao.Dao.get(Dao.java:220)
...

Наличие NPE говорит, как раз, о недоработке этого момента. Если проекция обязательна, то такую ситуацию нужно обрабатывать и выдавать соответствующее сообщение. В Jira Hibernate нашлась оооочень древняя задача на эту тему HHH-993, почему-то её тип определён как «Улучшение»… Больше похоже на баг.

Решение – добавить проекцию по идентификатору:

DetachedCriteria postsCriteria = DetachedCriteria.forClass(Post.class)
.add(anyRestriction)
.setProjection(Projections.id());

Отключение автоматического слияния веток в Mercurial

[ui]
merge = kdiff3

[merge-tools]
kdiff3.premerge = false
kdiff3.args=--L1 base --L2 local --L3 other $base $local $other -o $output

Как удалить все файлы .orig?

Для удаления файлов и директорий не находящихся под контролем версий Mercurial существует расширение PurgeExtension.

Подключить расширение:

[extensions]
hgext.purge=

Команда:

hg purge

Команда удалит все файлы кроме тех, что указаны в .hgignore.

Проблема преобразования PDF-документа в изображение с помощью ImageMagick

В ОС Windows 64-bit вызов команды ImageMagick

convert -density 300 document.pdf document.jpg

приводит к ошибке:

convert.EXE: `%s' (%d) "gswin32c.exe" -q -dQUIET -dPARANOIDSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dEPSCrop -dAlignToPixels=0 -dGridF
itTT=2 "-sDEVICE=pngalpha" -dTextAlphaBits=4 -dGraphicsAlphaBits=4 "-r300x300"  "-sOutputFile=C:/Users/ANY-~1/AppData/Local/Temp/magick-D-YAD1pq--000
0001" "-fC:/Users/ANY-~1/AppData/Local/Temp/magick-sgVE1bvb" "-fC:/Users/ANY-~1/AppData/Local/Temp/magick-B-iYsgs7" @ error/utility.c/SystemCommand
/2094.
convert.EXE: Postscript delegate failed `document.pdf': No such file or directory @ error/pdf.c/ReadPDFImage/664.
convert.EXE: missing an image filename `document.jpg' @ error/convert.c/ConvertImageCommand/3015.

Решение

1. Установить утилиту ghostscript, если еще не установлена.

2. Внести следующие изменения в реестр:

[HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/GPL Ghostscript]

[HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/GPL Ghostscript/<версия>]
"GS_DLL"="<путь до ghostscript>\bin\gsdll32.dll"
"GS_LIB"="<путь до ghostscript>\bin;<путь до ghostscript>\lib;<путь до ghostscript>\fonts"

Как удалить непоследнюю ревизию из локального репозитория?

Подключить плагин MqExtension:

[extensions]
mq =

Команда:

hg strip <номер ревизии>

Шаблон для исключения последовательности символов в регулярных выражениях

((.|\\n(?!sequence))*

Под такую маску попадает любой символ, кроме символов, порядок которых совпадает с «sequence».

Логирование запросов и параметров для Hibernate

Вывод запросов:

<category name="org.hibernate.SQL">
    <priority value="DEBUG"/>
</category>

Вывод параметров:

<category name="org.hibernate.type">
    <priority value="TRACE"/>
</category>

В аппендере должен быть указан соответствующий Threshold:

<appender name="CONSOLE">     
    <param name="Threshold" value="TRACE"/>
...

Как откатить незакоммиченный merge?

Предупреждение выглядит так:

hg revert -a
abort: uncommitted merge - use "hg update", see "hg help revert"

Для просмотра родителей рабочей копии служит команда:

hg parents

После выполнения мержа в списке будет выведено два родителя. Для отката мержа:

hg revert --all -r .
hg update -C -r .

См. hg parents, в результате должен остаться только один.

Источник: http://webcache.googleusercontent.com/

Как изменить текущее значение секвенци в Oracle?

Специальной операции для смены текущего значения секвенции в Oracle нет. Но его можно изменить путём пересоздания самой секвенции с нужным стартовым значением (start with).

В доке попалось на глаза такое руководство по модификации значения INCREMENT BY в операции ALTER SEQUENCE:

If you change the INCREMENT BY value before the first invocation of NEXTVAL, some sequence numbers will be skipped. Therefore, if you want to retain the original START WITH value, you must drop the sequence and re-create it with the original START WITH value and the new INCREMENT BY value (oracle.com). Продолжить чтение

Ошибка ORA-00932 при построении критерии по сущности с полем CLOB

Наткнулась на такую ошибку:

ORA-00932: inconsistent datatypes: expected - got CLOB

при выполнении запроса по критерии:

getCriteria()
    .addOrder(Order.asc("anyClobField"))
    .list();

Первое, что вызвало подозрение мэппинг, так как ошибки с ним валятся в момент обращения к сущности (в проекте авто-валидация/-генерация отключена: hibernate.hbm2ddl.auto=none). Долго искала, что же не так в мэппинге. Ошибка ORA-00932, конечно, очень содержательная – «сразу про всё».

Оказалось, просто, Oracle не поддерживает сортировку по полям типа CLOB.

Опять спас stackoverflow.com.

Конвертация между String и byte[]

Конвертировать String в byte[]:

String string = "text";
byte[] byteArray = string.getBytes("UTF-8");

Конвертировать byte[] в String:

byte[] byteArray = {(byte) 99, (byte) 97, (byte) 116};
String string = new String(byteArray, "US-ASCII");

Необходимо верно указать имя кодировки. Список поддерживаемых кодировок можно посмотреть тут.

Источник: http://stackoverflow.com/

Функция Oracle: если null, то вернуть определенное значение…

select nvl(<any property or subquery>, 'n/a') from dual;

В браузерах IE и Google Chrome не срабатывает редирект на страницу 404

«If a custom 404 page is smaller than 512 bytes, then IE and Chrome display their own built-in 404 page. So if you want to have your own 404 page and ensure that it’s rendered on all browsers, make sure that it’s big enough.»

Чтобы IE и Google Chrome сумели открыть страницу 404, размер страницы должен быть не менее 512 байт.

Источники: catalysts.cc plinko.net

Проблема валидации схемы данных Hibernate-ом

В режиме валидации схемы (hibernate.hbn2dll.auto=validate), если в БД присутствуют другие схемы с таблицами совпадающими по именам с данными из текущей схемы, могут возникнуть проблемы. Непосредственно у меня в режиме валидации для схемы Oracle пыталась выполнится валидация таблицы из другой схемы, тогда как при отключении валидации, обращения шли к нужной таблице. Чтобы устранить эту неприятность – достаточно ограничить права пользователя, который осуществляет доступ к схеме. Роли – CONNECT, RESOURCE, все остальное запрещено.

Сортировка выборок с помощью функции decode в Oracle

Иногда возникает потребность сортировать поля не только по убыванию и возрастанию значений полей. Например, есть список стран, их нужно отсортировать по алфавиту, но страна с названием «Россия» должна быть первой в списке. В таком случае может помочь функция decode().

decode(<column>, <value1>, <code1>, <value2>, <code2>, ..., <default_code>)

column – имя столбца для декодирования. Значения этого столбца совпадающее с value1 будет заменено на code1, value2 – на code2, для всех неописанных значений – на default_code. После этого по этим новым значениям можно выполнить стандартную сортировку asc-desc.

Запрос будет выглядеть так:

select *
from countries
order by decode(title, 'Россия', 'A', 'Z'), title