{"id":15200,"date":"2013-07-05T13:00:49","date_gmt":"2013-07-05T10:00:49","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/?p=15200"},"modified":"2013-07-05T08:58:34","modified_gmt":"2013-07-05T05:58:34","slug":"linq-and-java","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2013\/07\/linq-and-java.html","title":{"rendered":"LINQ and Java"},"content":{"rendered":"<p><a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/vstudio\/bb397926.aspx\">LINQ<\/a> has been quite a successful, but also controversial addition to the <a title=\".NET Framework\" href=\"http:\/\/www.microsoft.com\/net\" target=\"_blank\" rel=\"homepage\">.NET<\/a> ecosystem. Many people are looking for a comparable solution in the Java world. To better understand what a comparable solution could be, let\u2019s have a look at the main problem that LINQ solves:<\/p>\n<p>Query languages are often <a title=\"Declarative programming\" href=\"http:\/\/en.wikipedia.org\/wiki\/Declarative_programming\" target=\"_blank\" rel=\"wikipedia\">declarative programming<\/a> languages with many keywords. They offer few control-flow elements, yet they are highly descriptive. The most popular query language is <a title=\"SQL\" href=\"http:\/\/www.iso.org\/iso\/catalogue_detail.htm?csnumber=45498\" target=\"_blank\" rel=\"homepage\">SQL<\/a>, the ISO\/IEC standardised Structured Query Language, mostly used for relational databases.<\/p>\n<p>Declarative programming means that programmers do not explicitly phrase out their algorithms. Instead, they describe the result they would like to obtain, leaving algorithmic calculus to their implementing systems. Some databases have become very good at interpreting large SQL statements, applying SQL language transformation rules based on language syntax and metadata. An interesting read is\u00a0<a title=\"How schema meta data impacts Oracle query\u00a0transformations\" href=\"http:\/\/blog.jooq.org\/2011\/11\/25\/how-schema-meta-data-impacts-oracle-query-transformations\/\">Tom Kyte\u2019s metadata matters<\/a>, hinting at the incredible effort that has been put into Oracle\u2019s Cost-Based Optimiser. Similar papers can be found for SQL Server, DB2 and other leading RDBMS.<\/p>\n<h2>LINQ-to-SQL is not SQL<\/h2>\n<p>LINQ is an entirely different query language that allows to embed declarative programming aspects into .NET languages, such as C#, or ASP. The nice part of LINQ is the fact that a C# compiler can compile something that looks like SQL in the middle of C# statements. In a way, LINQ is to .NET what SQL is to PL\/SQL, pgplsql or what <a href=\"http:\/\/www.jooq.org\">jOOQ<\/a> is to Java (<a title=\"jOOQ as a PL\/Java\u00a0language\" href=\"http:\/\/blog.jooq.org\/2013\/04\/27\/jooq-as-a-pljava-language\/\">see my previous article about PL\/Java<\/a>). But unlike PL\/SQL, which embeds the actual SQL language,\u00a0<a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/vstudio\/bb386976.aspx\">LINQ-to-SQL<\/a>\u00a0does not aim for modelling SQL itself within .NET. It is a higher-level abstraction that keeps an open door for attempting to unify querying against various heterogeneous data stores in a single language. This unification will create a <a href=\"http:\/\/www.codinghorror.com\/blog\/2006\/06\/object-relational-mapping-is-the-vietnam-of-computer-science.html\">similar impedance mismatch as ORM<\/a> did before, maybe an even bigger one. While similar languages can be transformed into each other to a certain extent, it can become quite difficult for an advanced SQL developer to predict what actual SQL code will be generated from even very simple LINQ statements.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<h2>LINQ Examples<\/h2>\n<p>This gets more clear when looking at some examples given by the LINQ-to-SQL documentation. For example the <code><a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/vstudio\/bb399387.aspx\">Count()<\/a><\/code>\u00a0aggregate function:<\/p>\n<pre class=\" brush:java\">System.Int32 notDiscontinuedCount =\r\n    (from prod in db.Products\r\n    where !prod.Discontinued\r\n    select prod)\r\n    .Count();\r\n\r\nConsole.WriteLine(notDiscontinuedCount);<\/pre>\n<p>In the above example, it is not immediately clear if the <code>.Count()<\/code> function is transformed into a SQL <code>count(*)<\/code> aggregate function within the parenthesised query (then why not put it into the projection?), or if it will be applied only after executing the query, in the application memory. The latter would be prohibitive, if a large number or records would need to be transferred from the database to memory.\u00a0Depending on the transaction model, they would even need to be read-locked!<\/p>\n<p>Another example is given here where <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/vstudio\/bb386922.aspx\">grouping is explained<\/a>:<\/p>\n<pre class=\" brush:java\">var prodCountQuery =\r\n    from prod in db.Products\r\n    group prod by prod.CategoryID into grouping\r\n    where grouping.Count() &gt;= 10\r\n    select new\r\n    {\r\n        grouping.Key,\r\n        ProductCount = grouping.Count()\r\n    };<\/pre>\n<p>In this case, LINQ models its language aspects entirely different from SQL. The above LINQ <code>where<\/code> clause is obviously a SQL <code>HAVING<\/code> clause. <code>into grouping<\/code> is an alias for what will be a grouped tuple, which is quite a nice idea. This does not directly map to SQL, though, and must be used by LINQ internally, to produce typed output. What\u2019s awesome, of course, are the statically typed projections that can be reused afterwards, directly in C#!<\/p>\n<p>Let\u2019s look at another grouping example:<\/p>\n<pre class=\" brush:java\">var priceQuery =\r\n    from prod in db.Products\r\n    group prod by prod.CategoryID into grouping\r\n    select new\r\n    {\r\n        grouping.Key,\r\n        TotalPrice = grouping.Sum(p =&gt; p.UnitPrice)\r\n    };<\/pre>\n<p>In this example, C#\u2019s functional aspects are embedded into LINQ\u2019s <code>Sum(p =&gt; p.UnitPrice)<\/code> aggregate expression. <code>TotalPrice = ...<\/code> is just simple column aliasing. The above leaves me with lots of open questions. How can I control, which parts are really going to be translated to SQL, and which parts will execute in my application, after a SQL query returns a partial result set? How can I predict whether a lambda expression is suitable for a LINQ aggregate function, and when it will cause a huge amount of data to be loaded into memory for in-memory aggregation? And also: Will the compiler warn me that it couldn\u2019t figure out how to generate a C#\/SQL algorithm mix? Or will this simply fail at runtime?<\/p>\n<h2>To LINQ or not to LINQ<\/h2>\n<p>Don\u2019t get me wrong. Whenever I look inside the LINQ manuals for some inspiration, I have a deep urge to try it in a project. It looks awesome, and well-designed. There are also lots of interesting <a href=\"http:\/\/stackoverflow.com\/questions\/tagged\/linq-to-sql\">LINQ questions on Stack Overflow<\/a>. I wouldn\u2019t mind having <a title=\"Will Java add LINQ to EL 3.0 in\u00a0JSR-341?\" href=\"http:\/\/blog.jooq.org\/2013\/03\/22\/will-java-add-linq-to-el-3-0-in-jsr-341\/\">LINQ in Java<\/a>, but I want to remind readers that LINQ is <em>NOT<\/em> SQL. If you want to stay in control of your SQL, LINQ or LINQesque APIs may be a bad choice for two reasons:<\/p>\n<ol>\n<li>Some SQL mechanisms cannot be expressed in LINQ. Just as with JPA, you may need to resort to plain SQL.<\/li>\n<li>Some LINQ mechanisms cannot be expressed in SQL. Just as with JPA, you may suffer from severe performance issues, and will thus resort again to plain SQL.<\/li>\n<\/ol>\n<p>Beware of the above when choosing LINQ, or a \u201cJava implementation\u201d thereof! You may be better off, using SQL (i.e. JDBC, <a href=\"http:\/\/www.jooq.org\">jOOQ<\/a>, or <a href=\"https:\/\/code.google.com\/p\/mybatis\/\">MyBatis<\/a>) for data fetching and <a title=\"Java Streams Preview vs .Net\u00a0LINQ\" href=\"http:\/\/blog.jooq.org\/2013\/03\/25\/java-streams-preview-vs-net-linq\/\">Java APIs (e.g. Java 8\u2032s Stream API)<\/a> for in-memory post-processing<\/p>\n<h2>LINQ-like libraries modelling SQL in Java, Scala<\/h2>\n<ul>\n<li>jOOQ: <a href=\"http:\/\/www.jooq.org\">http:\/\/www.jooq.org<\/a><\/li>\n<li>Sqltyped: <a href=\"https:\/\/github.com\/jonifreeman\/sqltyped\">https:\/\/github.com\/jonifreeman\/sqltyped<\/a><\/li>\n<\/ul>\n<h2>LINQ-like libraries abstracting SQL syntax and data stores in Java, Scala<\/h2>\n<ul>\n<li>Quaere: <a href=\"http:\/\/quaere.codehaus.org\">http:\/\/quaere.codehaus.org<\/a><\/li>\n<li>JaQu: <a href=\"http:\/\/www.h2database.com\/html\/jaqu.html\">http:\/\/www.h2database.com\/html\/jaqu.html<\/a><\/li>\n<li>Linq4j: <a href=\"https:\/\/github.com\/julianhyde\/linq4j\">https:\/\/github.com\/julianhyde\/linq4j<\/a><\/li>\n<li>Slick: <a href=\"http:\/\/slick.typesafe.com\/\">http:\/\/slick.typesafe.com\/<\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<div style=\"border: 1px solid #D8D8D8; background: #FAFAFA; width: 100%; padding-left: 5px;\"><b><i>Reference: <\/i><\/b><a href=\"http:\/\/blog.jooq.org\/2013\/07\/01\/linq-and-java\/\">LINQ and Java<\/a> from our <a href=\"http:\/\/www.javacodegeeks.com\/jcg\">JCG partner<\/a> Lukas Eder at the <a href=\"http:\/\/blog.jooq.org\/\">JAVA, SQL, AND JOOQ<\/a> blog.<\/div>\n","protected":false},"excerpt":{"rendered":"<p>LINQ has been quite a successful, but also controversial addition to the .NET ecosystem. Many people are looking for a comparable solution in the Java world. To better understand what a comparable solution could be, let\u2019s have a look at the main problem that LINQ solves: Query languages are often declarative programming languages with many &hellip;<\/p>\n","protected":false},"author":68,"featured_media":112,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[798],"class_list":["post-15200","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-linq"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>LINQ and Java<\/title>\n<meta name=\"description\" content=\"LINQ has been quite a successful, but also controversial addition to the .NET ecosystem. Many people are looking for a comparable solution in the Java\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2013\/07\/linq-and-java.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"LINQ and Java\" \/>\n<meta property=\"og:description\" content=\"LINQ has been quite a successful, but also controversial addition to the .NET ecosystem. Many people are looking for a comparable solution in the Java\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2013\/07\/linq-and-java.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2013-07-05T10:00:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Lukas Eder\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@http:\/\/twitter.com\/JavaOOQ\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Eder\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/07\\\/linq-and-java.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/07\\\/linq-and-java.html\"},\"author\":{\"name\":\"Lukas Eder\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/2e5562e68acc527c00dbe1cc618081b2\"},\"headline\":\"LINQ and Java\",\"datePublished\":\"2013-07-05T10:00:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/07\\\/linq-and-java.html\"},\"wordCount\":913,\"commentCount\":4,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/07\\\/linq-and-java.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"keywords\":[\"LINQ\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/07\\\/linq-and-java.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/07\\\/linq-and-java.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/07\\\/linq-and-java.html\",\"name\":\"LINQ and Java\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/07\\\/linq-and-java.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/07\\\/linq-and-java.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"datePublished\":\"2013-07-05T10:00:49+00:00\",\"description\":\"LINQ has been quite a successful, but also controversial addition to the .NET ecosystem. Many people are looking for a comparable solution in the Java\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/07\\\/linq-and-java.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/07\\\/linq-and-java.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/07\\\/linq-and-java.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"width\":150,\"height\":150,\"caption\":\"java-interview-questions-answers\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/07\\\/linq-and-java.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"LINQ and Java\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/2e5562e68acc527c00dbe1cc618081b2\",\"name\":\"Lukas Eder\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0539ed8cbcebfd5df5c2bd3048cf645d90f259da6851a005099b51edfd7a68e1?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0539ed8cbcebfd5df5c2bd3048cf645d90f259da6851a005099b51edfd7a68e1?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0539ed8cbcebfd5df5c2bd3048cf645d90f259da6851a005099b51edfd7a68e1?s=96&d=mm&r=g\",\"caption\":\"Lukas Eder\"},\"description\":\"Lukas is a Java and SQL enthusiast developer. He created the Data Geekery GmbH. He is the creator of jOOQ, a comprehensive SQL library for Java, and he is blogging mostly about these three topics: Java, SQL and jOOQ.\",\"sameAs\":[\"http:\\\/\\\/blog.jooq.org\\\/\",\"http:\\\/\\\/www.linkedin.com\\\/profile\\\/view?id=6409824\",\"https:\\\/\\\/x.com\\\/http:\\\/\\\/twitter.com\\\/JavaOOQ\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/Lukas-Eder\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"LINQ and Java","description":"LINQ has been quite a successful, but also controversial addition to the .NET ecosystem. Many people are looking for a comparable solution in the Java","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2013\/07\/linq-and-java.html","og_locale":"en_US","og_type":"article","og_title":"LINQ and Java","og_description":"LINQ has been quite a successful, but also controversial addition to the .NET ecosystem. Many people are looking for a comparable solution in the Java","og_url":"https:\/\/www.javacodegeeks.com\/2013\/07\/linq-and-java.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2013-07-05T10:00:49+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","type":"image\/jpeg"}],"author":"Lukas Eder","twitter_card":"summary_large_image","twitter_creator":"@http:\/\/twitter.com\/JavaOOQ","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Lukas Eder","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2013\/07\/linq-and-java.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/07\/linq-and-java.html"},"author":{"name":"Lukas Eder","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/2e5562e68acc527c00dbe1cc618081b2"},"headline":"LINQ and Java","datePublished":"2013-07-05T10:00:49+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/07\/linq-and-java.html"},"wordCount":913,"commentCount":4,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/07\/linq-and-java.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","keywords":["LINQ"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2013\/07\/linq-and-java.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2013\/07\/linq-and-java.html","url":"https:\/\/www.javacodegeeks.com\/2013\/07\/linq-and-java.html","name":"LINQ and Java","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/07\/linq-and-java.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/07\/linq-and-java.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","datePublished":"2013-07-05T10:00:49+00:00","description":"LINQ has been quite a successful, but also controversial addition to the .NET ecosystem. Many people are looking for a comparable solution in the Java","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/07\/linq-and-java.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2013\/07\/linq-and-java.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2013\/07\/linq-and-java.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","width":150,"height":150,"caption":"java-interview-questions-answers"},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2013\/07\/linq-and-java.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"LINQ and Java"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/2e5562e68acc527c00dbe1cc618081b2","name":"Lukas Eder","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/0539ed8cbcebfd5df5c2bd3048cf645d90f259da6851a005099b51edfd7a68e1?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/0539ed8cbcebfd5df5c2bd3048cf645d90f259da6851a005099b51edfd7a68e1?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0539ed8cbcebfd5df5c2bd3048cf645d90f259da6851a005099b51edfd7a68e1?s=96&d=mm&r=g","caption":"Lukas Eder"},"description":"Lukas is a Java and SQL enthusiast developer. He created the Data Geekery GmbH. He is the creator of jOOQ, a comprehensive SQL library for Java, and he is blogging mostly about these three topics: Java, SQL and jOOQ.","sameAs":["http:\/\/blog.jooq.org\/","http:\/\/www.linkedin.com\/profile\/view?id=6409824","https:\/\/x.com\/http:\/\/twitter.com\/JavaOOQ"],"url":"https:\/\/www.javacodegeeks.com\/author\/Lukas-Eder"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/15200","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/68"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=15200"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/15200\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/112"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=15200"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=15200"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=15200"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}