jooq - select удаляет информацию о длине varchar для приведения

при вызове этого кода

DSLContext dslContext = DSL.using(SQLDialect.SQLSERVER);
dslContext.select(DSL.cast(field, SQLDataType.VARCHAR.length(255)));

оператор select удаляет информацию о длине varchar. Метод DSL.cast() возвращает cast("fieldName" as varchar(255)), а выбор возвращает select cast("fieldName" as varchar).

Проблема заключается в том, что в SQLServer приведение без информации о длине обрезает результат после 30 символов, что описано здесь. Это очень раздражает, потому что мои значения имеют длину более 30 символов. Итак, кто-нибудь знает, как я могу получить оператор выбора, который выглядит так select cast("fieldName" as varchar(255))?


person Simone    schedule 18.05.2015    source источник
comment
Какую версию jOOQ вы используете?   -  person Lukas Eder    schedule 18.05.2015
comment
Я использую jooq-codegen-maven 3.0.0.   -  person Simone    schedule 19.05.2015


Ответы (1)


Информация о длине, точности и масштабе в DataType была введена только в jOOQ 3.0, хотя эта информация не использовалась в CAST() выражениях до jOOQ 3.2 (issue #2708 ):

Последняя версия jOOQ корректно отображает

cast([fieldName] as varchar(255))

Так что советую обновиться до последней версии.

Кроме того, если ваша версия/использование генерирует cast("fieldName" as varchar), я подозреваю, что вы также можете передать неправильный SQLDialect (вместо SQLSERVER). В диалекте SQLSERVER идентификаторы генерируются с использованием [brackets], в отличие от других диалектов, использующих "double quotes" для идентификаторов...

person Lukas Eder    schedule 19.05.2015
comment
Спасибо. Вы правы, это синтаксис SQLServer, использующий скобки. Я пробовал разные диалекты, и все они ведут себя одинаково, поэтому я перепутал пример. - person Simone; 20.05.2015
comment
@Simone: Хорошо, просто хотел быть уверенным в диалекте :) Итак, обновление сработало для вас? - person Lukas Eder; 20.05.2015
comment
Да. Кстати, как ведут себя выражения приведения в выражениях concat, если поле имеет varchar с длиной? Что-то вроде этого ‹code›DSL.concat(DELIM, table.val)‹/code› - person Simone; 20.05.2015
comment
@Simone: Хм, а где актерский состав в этом примере? кстати: вы можете использовать обратные кавычки, такие как `code`, чтобы разграничить код при переполнении стека :) - person Lukas Eder; 20.05.2015
comment
Что-то вроде этого Field‹String› DELIM = inline(\); DSL.concat(DELIM, table.val, DELIM); где table.val имеет тип VARCHAR(4000)? Является ли table.val приведенным, потому что он имеет тип VARCHAR (4000), а не тип VARCHAR? - person Simone; 20.05.2015
comment
@Simone: Нет, при таком использовании не должно быть автоматического приведения из-за DSL.concat() ... Однако могут быть приведения, когда вы передаете нестроковые значения в concat(). Вы столкнулись с какой-либо конкретной проблемой? - person Lukas Eder; 20.05.2015
comment
Пробовал с версией 3.0.0. и table.val приведен. Не знаю как ведет себя в новых версиях. - person Simone; 20.05.2015