Подтвердить что ты не робот

Инструмент LINQ для Java

Будет ли LINQ для java полезным инструментом? Я работаю над инструментом, который позволит объекту Java сопоставлять строку в базе данных.

  • Будет ли это полезно для Java программисты?
  • Какие функции будут полезным?
4b9b3361

Ответ 1

LINQ для Java будет прекрасным, но проблема заключается в интеграции языков.

Java не имеет ничего такого же лаконичного, как лямбда-выражения, и они являются одним из оснований LINQ. Я полагаю, что они могут сложить поддержку выражений запроса поверх нормальной Java без лямбда-выражений, сделав расширение создающим анонимные внутренние классы, но это было бы довольно отвратительно. Вам также нужны деревья выражений, если вы хотите сделать что-то вроде LINQ to SQL.

Проверенные исключения могут мешать, но мы должны увидеть. В эквиваленте IQueryable должно быть какое-то общее исключение с проверкой - возможно, оно может быть общим как в типе элемента, так и в типе исключения...

В любом случае, это все pie-in-the-sky - учитывая проблемы, с которыми сталкивается сообщество Java, с закрытием, я думаю, было бы глупо ожидать от LINQ в самой Java раньше, чем в 2012 году. Конечно, это не сказать, что это невозможно на языке Java. Groovy имеет некоторые полезные аспекты, например.

Для библиотеки сторона Hibernate уже предоставляет "неинтегрированную" версию многих функций LINQ to SQL. Для LINQ to Objects вы должны посмотреть на API коллекций Google Java - это много того же типа (фильтрация, проецирование и т.д.). Разумеется, без lambdas это очень удобно использовать, но это все же действительно, очень удобно. (Я все время использую код Коллекции Google, и мне бы не хотелось возвращаться к коллекциям Java "vanilla".)

Ответ 2

Стоит отметить, что 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

Ответ 3

Для более общего подхода к проблеме рассмотрите возможность использования Querydsl.

Он предоставляет синтаксис стиля LINQ с поддержкой фреймов JPA/Hibernate, JDO, SQL и Java.

Я поддерживаю Querydsl, поэтому этот ответ предвзятый.

Ответ 4

Java LINQ to SQL реализация. Обеспечивает полную языковую интеграцию и больший набор функций по сравнению с .NET LINQ.

Ответ 5

Hibernate использует HQL. Вы можете выполнять Object, но только для реляционных баз данных

Ответ 6

Расширение Java, которое предоставляет возможности LINQ-to-objects, SBQL4J. Он предлагает:

  • Тип безопасности во время компиляции
  • Мощный механизм запросов с большими возможностями, чем LINQ
  • Совместимость с текущими JVM (он использует предварительную обработку для перевода запросов на чистый Java-код)
  • Хорошая производительность (во время выполнения не используется отражение)
  • Четкая, точная семантика без лишнего, неясного синтаксического сахара.

Ответ 7

Детские шаги:

Первый подход: реализовать Java LINQ, используя строки для выражений, а не лямбда.

Напишите IQueryProviders на основе строковых выражений.

Затем продолжайте добавлять строковые выражения непосредственно на языке.

Но во-первых, я хочу, чтобы LINQ работал: набрал linq на языке, это хорошая вещь, но главное: есть способ написать IQueryProviders, затем написать провайдер для POJO, поставщик для Hibernate, поставщика SQL Server или Oracle и т.д.

Ответ 8

Siena проект кажется хорошим.