Упорядочить по подстроке ID как целое число в HQL с Grails - PullRequest
3 голосов
/ 01 марта 2012

Есть ли способ заказать по подстроке ID, приведенной к целому числу, используя HQL или / и критерии?

Например:

class Foo {
  String id
  String name
}

Сортированный набор данных будет выглядеть так:

90-1  David
90-4  Mike
101-1 Jack
101-2 Peter
105-1 Jon
105-7 Jane

С базой данных MySQL и собственным sql это будет сделано так:

order by 
CAST(substring_index(id, '-', 1) AS UNSIGNED),
CAST(substring(id, length(substring_index(id, '-', 1)) + 2) AS UNSIGNED)

Я попытался использовать формулу, как было предложено, но это не сработало, потому что UNSIGNED рассматривался как псевдоним, а сгенерированный SQL имел _this.UNSIGNED

Integer fooFirstID
Integer fooSecondID

static mapping = {
    fooFirstID formula: "CAST(substring_index(id, '-', 1) AS UNSIGNED)"
    fooSecondID formula: "CAST(substring(id, length(substring_index(id, '-', 1))
                           + 2) AS UNSIGNED)" 
}

Я вижу, что Hibernate поддерживает как подстроку, так и приведение к типу Hibernate, но не может найти эквивалент substring_index.

Спасибо.

Ответы [ 2 ]

1 голос
/ 02 марта 2012

Вы можете использовать аннотацию @Formula и порядок для аннотированного свойства, оно отлично работает.

@Formula("CAST(substring_index(id, '-', 1) AS UNSIGNED)")
public varType getToto() {
  return toto;
}

@Formula("CAST(substring(id, length(substring_index(id, '-', 1)) + 2) AS UNSIGNED)")
public varType getTata() {
  return tata;
}

И тогда вы делаете в HQL: заказ по всему, tata

Кстати, вы можете рассмотреть возможность использования составного идентификатора.

0 голосов
/ 09 марта 2012

Ваша проблема в том, что тип не распознается как тип Hibernate. «Как» рассматривается как связующий псевдоним независимо от того, что вы делаете. Это странно, потому что, как гласит документация Hibernate:

cast (... as ...), где вторым аргументом является имя типа Hibernate, и extract (... from ...), если приведение ANSI cast () и extract () поддерживается базовая база данных

Даже если вы используете mysql, вы можете попробовать синтаксис преобразования postgre:

substring_index(id, '-', 1)::integer

Если вы используете H2, это INT, а не INTEGER

cast(substring_index(id, '-', 1) as INT)

Также обратите внимание, что соответствующими операциями, в которых вы можете использовать понятие без знака в Java, являются двоичные, шестнадцатеричные или восьмеричные преобразования (для начального бита, очевидно). Они всегда обрабатывают Integer как целое число без знака, так что это не имеет значения. Если вы действительно хотите применить это понятие, вам придется использовать short с начальным битом и привести его к int, что даст вам «действительно неподписанный» int.

...