LINQ для Java
От: Аноним  
Дата: 16.01.14 20:51
Оценка: 6 (1)
Наткнулся тут на статью по этому поводу.
Кто что думает по этому поводу?
А там есть упоминание вот этого.
Re: LINQ для Java
От: Blazkowicz Россия  
Дата: 17.01.14 07:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Наткнулся тут на статью по этому поводу.

А>Кто что думает по этому поводу?
А>А там есть упоминание вот этого.
Ну, я думаю, что лямбды это один уверенный шаг к тому чтобы отказаться от запросов и свойств в виде строковых литералов. HQL в строках сильно напрягает, но зачастую он сильно проще чем Criteria API. Да и сам Criteria API с вездесущими именами свойств напрягает. Аналог QueryDSL/Criteria API на лямбдах был бы очень кстати.
Даже в тех же JavaBeans к свойствам надо обращатся через строку-литерал. Для меня на данный момент это один из самых нелюбимых аспектов в Java.
Re[2]: LINQ для Java
От: avpavlov  
Дата: 17.01.14 08:33
Оценка: 2 (2) -1
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>Наткнулся тут на статью по этому поводу.

А>>Кто что думает по этому поводу?
А>>А там есть упоминание вот этого.
B>Ну, я думаю, что лямбды это один уверенный шаг к тому чтобы отказаться от запросов и свойств в виде строковых литералов. HQL в строках сильно напрягает, но зачастую он сильно проще чем Criteria API. Да и сам Criteria API с вездесущими именами свойств напрягает. Аналог QueryDSL/Criteria API на лямбдах был бы очень кстати.
B>Даже в тех же JavaBeans к свойствам надо обращатся через строку-литерал. Для меня на данный момент это один из самых нелюбимых аспектов в Java.

LINQ (если говорить про его применение в SQL) чуть-чуть о другом. Он умеет по Ява коду сгенерировать SQL код. Лямбды в Ява8 даже рядом такого не позволят сделать.

B>Аналог QueryDSL/Criteria API на лямбдах был бы очень кстати.


Это уже LINQ получится. Но я не вижу как это сделать. Это фактически надо в рантайм проводить декомпиляцию кода, чтобы вытащить какие свойства бинов и в каком контексте (фильтры, сортировка и т.д.) используются.

В Скала намного больше мета-информации доступно, и то к ЛИНКу даже близко не приблизились. Правда макросы сейчас пилят, вот на макросах уже можно будет ЛИНК сделать.
Re[3]: LINQ для Java
От: avpavlov  
Дата: 17.01.14 08:35
Оценка:
Если что, везде, где я пишу ЛИНК, я имею ввиду LINQ2SQL
Re[3]: LINQ для Java
От: Blazkowicz Россия  
Дата: 17.01.14 08:36
Оценка:
Здравствуйте, avpavlov, Вы писали:

A>LINQ (если говорить про его применение в SQL) чуть-чуть о другом. Он умеет по Ява коду сгенерировать SQL код. Лямбды в Ява8 даже рядом такого не позволят сделать.

Он умеет ещё и запрос провалидировать на базе в compile-time. Понятно что это не только Query DSL, а целая инфраструктура.

A>Это уже LINQ получится. Но я не вижу как это сделать. Это фактически надо в рантайм проводить декомпиляцию кода, чтобы вытащить какие свойства бинов и в каком контексте (фильтры, сортировка и т.д.) используются.

Почему? Вместо строковых литералов будут лямбды со ссылками на getter-ы, например.
Re[4]: LINQ для Java
От: avpavlov  
Дата: 17.01.14 08:41
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, avpavlov, Вы писали:


A>>LINQ (если говорить про его применение в SQL) чуть-чуть о другом. Он умеет по Ява коду сгенерировать SQL код. Лямбды в Ява8 даже рядом такого не позволят сделать.

B>Он умеет ещё и запрос провалидировать на базе в compile-time. Понятно что это не только Query DSL, а целая инфраструктура.

A>>Это уже LINQ получится. Но я не вижу как это сделать. Это фактически надо в рантайм проводить декомпиляцию кода, чтобы вытащить какие свойства бинов и в каком контексте (фильтры, сортировка и т.д.) используются.

B>Почему? Вместо строковых литералов будут лямбды со ссылками на getter-ы, например.

поля — это ещё не весь запрос

Как превратить

from(...).where(bean -> bean.id == 1)

в

from bean where bean.id == 1

? (хинт: "== 1" достать не так просто )
Re[5]: LINQ для Java
От: Blazkowicz Россия  
Дата: 17.01.14 08:43
Оценка:
Здравствуйте, avpavlov, Вы писали:

A>Как превратить

A>from(...).where(bean -> bean.id == 1)
A>from bean where bean.id == 1

Так же как и сейчас в Java — заменить на .eq(1)
Re[6]: LINQ для Java
От: avpavlov  
Дата: 17.01.14 08:49
Оценка: 2 (2) +1
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, avpavlov, Вы писали:


A>>Как превратить

A>>from(...).where(bean -> bean.id == 1)
A>>from bean where bean.id == 1

B>Так же как и сейчас в Java — заменить на .eq(1)


в таком стиле и без лямбд можно писать, наглядность получается так себе, HQL/SQL+именованные параметры намного приятнее выглядят, а при редактировании в ИДЕЕ так ещё и со всеми возможными проверками и автокомплитом получается. Ещё в пользу "SQL+именованные параметры" говорит, что его можно скопипастить и погонять на сервере через SQL редактор какой-нибудь, а потом обратно.
Re[6]: LINQ для Java
От: avpavlov  
Дата: 17.01.14 08:53
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, avpavlov, Вы писали:


A>>Как превратить

A>>from(...).where(bean -> bean.id == 1)
A>>from bean where bean.id == 1

B>Так же как и сейчас в Java — заменить на .eq(1)


И, кстати, для этого нужны спец. бины, т.е. связка "обычные бины + лямбды" не прокатывает
Re[7]: LINQ для Java
От: Blazkowicz Россия  
Дата: 17.01.14 08:55
Оценка:
Здравствуйте, avpavlov, Вы писали:

A>И, кстати, для этого нужны спец. бины, т.е. связка "обычные бины + лямбды" не прокатывает

У нас уже есть JavaFX свойства. Вот тебе и специальные бины.
Re[7]: LINQ для Java
От: Blazkowicz Россия  
Дата: 17.01.14 09:01
Оценка:
Здравствуйте, avpavlov, Вы писали:

A>в таком стиле и без лямбд можно писать, наглядность получается так себе, HQL/SQL+именованные параметры намного приятнее выглядят, а при редактировании в ИДЕЕ так ещё и со всеми возможными проверками и автокомплитом получается. Ещё в пользу "SQL+именованные параметры" говорит, что его можно скопипастить и погонять на сервере через SQL редактор какой-нибудь, а потом обратно.

Ну, в Criteria API тоже наглядностью не пахнет. Просто хотелось бы иметь compile time check.
Re[8]: LINQ для Java
От: avpavlov  
Дата: 17.01.14 09:27
Оценка:
B>Ну, в Criteria API тоже наглядностью не пахнет. Просто хотелось бы иметь compile time check.

КритериаАпи — это наихудшее решение с точки зрения наглядности и удобства, тут даже и обсуждать нечего.
Re[8]: LINQ для Java
От: avpavlov  
Дата: 17.01.14 09:28
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, avpavlov, Вы писали:


A>>И, кстати, для этого нужны спец. бины, т.е. связка "обычные бины + лямбды" не прокатывает

B>У нас уже есть JavaFX свойства. Вот тебе и специальные бины.

ЯваФХ как-то мимо меня проскочила, а что там за свойства такие волшебные?
Re[9]: LINQ для Java
От: Blazkowicz Россия  
Дата: 17.01.14 09:31
Оценка: 1 (1)
Здравствуйте, avpavlov, Вы писали:

A>ЯваФХ как-то мимо меня проскочила, а что там за свойства такие волшебные?

Property<Type> value = new SomeProperty<Type>();

Property<Type> valueProperty(){
   return value;
}

void setValue(Type value){
   value.set(value);
}

Type getValue(){
   return value.get();
}
Re[5]: LINQ для Java
От: andyag  
Дата: 17.01.14 10:05
Оценка:
Здравствуйте, avpavlov, Вы писали:

A>Как превратить


A>from(...).where(bean -> bean.id == 1)


A>в


A>from bean where bean.id == 1


A>? (хинт: "== 1" достать не так просто )


Оффтопик — ну кстати не так уж и сложно. Для
  Pred pred = new Pred() {
    @Override
    public boolean apply(int x) {
      return x == 1;
    }            
  };


ASM выдаёт вот такое:

L219848480
4                // push 1
160 L1735414378  // if top() != arg1 then goto L1735414378
4                
172              // return 1
L1735414378
3                
172              // return 0
L2134041139


Но дальше, конечно, придётся включать голову
Re[10]: LINQ для Java
От: avpavlov  
Дата: 17.01.14 10:06
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, avpavlov, Вы писали:


A>>ЯваФХ как-то мимо меня проскочила, а что там за свойства такие волшебные?

B>[java]
B>Property<Type> value = new SomeProperty<Type>();

Ну всё равно придётся на ОРМ как-то натягивать, я так понял, из коробки они даже с JPA не сопрягли
Re[6]: LINQ для Java
От: avpavlov  
Дата: 17.01.14 10:08
Оценка: 1 (1)
A>Но дальше, конечно, придётся включать голову

Про декомпиляцию я говорил с самого начала. Это как раз то, чего ЛИНК позволяет избежать, взяв эту работу на себя.
Re[11]: LINQ для Java
От: Blazkowicz Россия  
Дата: 17.01.14 10:14
Оценка: 3 (1)
Здравствуйте, avpavlov, Вы писали:

A>Ну всё равно придётся на ОРМ как-то натягивать, я так понял, из коробки они даже с JPA не сопрягли

Да, через задницу эти JavaFX свойства получились. JEE вообще с древности не предполагает что клиент-сервеная комуникация может быть без тупокого DTO копипаста.
Поэтому никто и не думал даже как эти свойства на сервере использовать.

Если говорить вообще про лямбды, то пока ничего толкового про их использовании в QueryDSL я не видел.
Re[7]: LINQ для Java
От: bl-blx Россия http://yegodm.blogspot.com
Дата: 17.01.14 10:25
Оценка:
Здравствуйте, avpavlov, Вы писали:


A>>Но дальше, конечно, придётся включать голову


A>Про декомпиляцию я говорил с самого начала. Это как раз то, чего ЛИНК позволяет избежать, взяв эту работу на себя.


Справедливости ради, добавлю, что там не только LINQ работает, но и компилятор и рантайм-библиотеки.
Одна из самых шикарных фич .NET — это захват выражения в виде AST (приоизводное от класса System.Linq.Expressions.Expresssion)
и возможность это AST в рантайме интерпретировать. Чем, собственно, тот же Entity Framework и пользуется,
транслируя LINQ-выражения в SQL-запросы. В Java8, похоже, ничего подобного сделать не получится.
Максимум, что я могу вообразить, это получение дескриптора свойства каким-то путём из java.lang.invoke.CallSite,
но этого недостаточно. Нет способа вытащить сложные выражения, как уже в треде упомянули.
El pueblo unido jamás será vencido.
Re[8]: LINQ для Java
От: avpavlov  
Дата: 17.01.14 10:33
Оценка:
A>>Про декомпиляцию я говорил с самого начала. Это как раз то, чего ЛИНК позволяет избежать, взяв эту работу на себя.

BB>Справедливости ради, добавлю, что там не только LINQ работает, но и компилятор и рантайм-библиотеки.

BB>Одна из самых шикарных фич .NET — это захват выражения в виде AST (приоизводное от класса System.Linq.Expressions.Expresssion)
BB>и возможность это AST в рантайме интерпретировать. Чем, собственно, тот же Entity Framework и пользуется,
BB>транслируя LINQ-выражения в SQL-запросы.

Ну так я и написал — "избежать декомпиляции"
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.