Будет ли LINQ для java полезным инструментом? Я работал над инструментом, который позволит сопоставить объект Java со строкой в базе данных.
Скала LINQ: github.com/nicholas22/propelS




LINQ для Java был бы прекрасен, но проблема в языковой интеграции.
В Java нет ничего более лаконичного, чем лямбда-выражения, и они являются одной из основ LINQ. Я полагаю, что они мог накладывают поддержку выражения запроса поверх обычной Java без лямбда-выражений, заставляя расширение создавать анонимные внутренние классы - но это было бы довольно ужасно. Вам также понадобятся деревья выражений, если вы хотите сделать что-нибудь вроде LINQ to SQL.
Проверенные исключения мощь мешают, но мы должны это увидеть. Эквивалент IQueryable должен иметь какое-то общее проверенное исключение - или, возможно, он может быть общим как для типа элемента, так и для типа исключения ...
В любом случае, это все пустяки - учитывая проблемы, с которыми сообщество Java сталкивается с замыканиями, я думаю, что было бы глупо ожидать чего-то вроде LINQ в самой Java раньше, чем примерно в 2012 году. Конечно, это не значит, что это было бы невозможно на "Java-подобном" языке. Например, Groovy уже имеет некоторые полезные аспекты.
Что касается библиотеки, Hibernate уже предоставляет «неинтегрированную» версию многих функций LINQ to SQL. Для LINQ to Objects вы должны посмотреть на API коллекций Google Java - это много чего того же (фильтрация, проектирование и т. д.). Без лямбд, конечно, гораздо сложнее использовать, но это все же очень, очень удобно. (Я все время использую код Google Collections на работе, и мне не хотелось бы возвращаться к "ванильным" Java-коллекциям.)
Какие проблемы испытывает java-сообщество с закрытием?
@Claudiu: Несколько предложений, ни одно из них не является полностью удовлетворительным. Последнее, что я слышал, казалось маловероятным, что он вообще войдет в Java 7, из-за большого количества дискуссий. Это обратная сторона такой демократичности Java.
Где пример проектирования в API коллекций Google?
@ Натан: см. Iterables.transform.
спасибо, я подумал, что это связано с методом преобразования, я подумал, что, возможно, может быть какой-то менее ручной подход, например, api типа hibernate Projection.
Теперь в Java есть лямбды, и JaQue (github.com/TrigerSoft/jaque) может создавать из них деревья выражений. Так что языковая интеграция больше не проблема.
@KonstantinTriger: Приятно видеть, что Java догоняет то место, где C# был так давно - действительно, так оно и есть. Я по-прежнему предпочитаю поддержку компилятор для деревьев выражений отдельной библиотеке, которая требует установки системного свойства, зависящего от реализации, и файлов, которые должны быть сгенерированы и проанализированы во время выполнения ...
Спящий режим использует HQL. Вы можете использовать Object, но только для реляционных баз данных
Стоит отметить, что Scala 2.8 получит поддержку LINQ ...
На самом деле стандартные коллекции scala предоставляют API, который в некотором смысле работает как LINQ-for-Objects. Вот пример:
List("Paris","Berlin","London","Tokyo")
.filter(c => c.endsWith("n"))
.map(c => c.length)
// result would be length of the words that ends
// with "n" letter ("Berlin" and "London").
Не бойтесь синтаксиса «новая строка-точка»: вы можете писать код в простом старом стиле:
Array(1,2,3,4,5,6).map(x => x*x)
И есть ряд проектов, которые обеспечивают синтаксис, близкий к LINQ-to-SQL. Например, фрагмент взят из Squeryll:
import Library._
using(session) {
books.insert(new Author(1, "Michel","Folco"))
val a = from(authors)(a=> where(a.lastName === "Folco") select(a))
}
// but note that there is more code behind this example
Вроде еще нет, но есть надежда. Scala и раньше совершала великие подвиги, например, интегрируя XML в язык. И я надеюсь, что станет лучше :)
Для более общего подхода к проблеме рассмотрите возможность использования Querydsl.
Он предоставляет синтаксис в стиле LINQ с поддержкой бэкэндов JPA / Hibernate, JDO, SQL и Java Collection.
Я сопровождаю Querydsl, поэтому этот ответ необъективен.
Реализация Java LINQ to SQL. Обеспечивает полную языковую интеграцию и более широкий набор функций по сравнению с .NET LINQ.
Расширение Java, которое предоставляет возможности LINQ-to-objects, - это SBQL4J. Это предлагает:
Шаги малыша:
Первый подход: реализовать Java LINQ с использованием строк для выражений вместо лямбда.
Напишите IQueryProviders на основе строковых выражений.
Затем продолжайте добавлять строковые выражения непосредственно в язык.
Но сначала мне нужен LINQ, который работает: набрал linq на языке, это хорошая вещь, но ГЛАВНАЯ точка: есть способ написать IQueryProviders, затем написать поставщика для POJOs, поставщика для Hibernate, поставщика для SQL Сервер или Oracle и т.д ...
Проект Сиена кажется хорошим.
Для объектов LINQ to проверьте этот: github.com/nicholas22/jpropel-light, реальный пример: new String [] {"james", "john", "john", "eddie"} .where (startWith ("j ")). toList (). Отдельный ();