{"id":17203954,"url":"https://github.com/ivanceras/fluentsql","last_synced_at":"2025-04-13T21:20:46.698Z","repository":{"id":20508448,"uuid":"23787045","full_name":"ivanceras/fluentsql","owner":"ivanceras","description":"fluent sql is a SQL writer used by ivanceras ORM","archived":false,"fork":false,"pushed_at":"2014-12-18T08:58:49.000Z","size":384,"stargazers_count":12,"open_issues_count":0,"forks_count":3,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-05-23T01:33:05.755Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ivanceras.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-09-08T10:37:03.000Z","updated_at":"2022-01-14T09:38:37.000Z","dependencies_parsed_at":"2022-08-21T05:10:14.039Z","dependency_job_id":null,"html_url":"https://github.com/ivanceras/fluentsql","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivanceras%2Ffluentsql","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivanceras%2Ffluentsql/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivanceras%2Ffluentsql/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivanceras%2Ffluentsql/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ivanceras","download_url":"https://codeload.github.com/ivanceras/fluentsql/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248429664,"owners_count":21101873,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-15T02:19:59.407Z","updated_at":"2025-04-13T21:20:46.674Z","avatar_url":"https://github.com/ivanceras.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"fluentsql\n==========\n\n[![Build Status](https://api.travis-ci.org/ivanceras/fluentsql.svg)](https://travis-ci.org/ivanceras/fluentsql)\n\nA minimalistic Fluent SQL API for Java aimed to resemble the code to your original SQL code.\n\n     \n##Example\n * Writing SQL code using string concatentation in Java\n\n````java\n  \tString sql =\n\t\t\t\t\" WITH LatestOrders AS (\" +\n\t\t\t\t\"\t\tSELECT CustomerName , \"+\n\t\t\t\t\"\t\t\t\tSUM ( COUNT ( ID ) ) ,\" +\n\t\t\t\t\"\t\t\t\tCOUNT ( MAX ( n_items ) ) , \" +\n\t\t\t\t\"\t\t\t\tRed as color\" +\n\t\t\t\t\"\t\t\tFROM dbo.Orders\" +\n\t\t\t\t\"\t\t\tRIGHT JOIN Customers\" +\n\t\t\t\t\"\t\t\t\ton Orders.Customer_ID = Customers.ID \" +\n\t\t\t\t\"\t\t\tLEFT JOIN Persons\" +\n\t\t\t\t\"\t\t\t\tON Persons.name = Customer.name\" +\n\t\t\t\t\"\t\t\t\tAND Persons.lastName = Customer.lastName\" +\n\t\t\t\t\"\t\t\tGROUP BY CustomerID\" +\n\t\t\t\t\"\t\t) \"+\n\t\t\t\t\"  SELECT \"+\n\t\t\t\t\"    Customers.* , \"+\n\t\t\t\t\"    Orders.OrderTime AS LatestOrderTime , \"+\n\t\t\t\t\"    ( SELECT COUNT ( * ) \" +\n\t\t\t\t\"\t\tFROM dbo.OrderItems \" +\n\t\t\t\t\"\t\tWHERE OrderID IN \"+\n\t\t\t\t\"        ( SELECT ID FROM dbo.Orders WHERE CustomerID = Customers.ID )  \"+\n\t\t\t\t\"      )      AS TotalItemsPurchased \"+\n\t\t\t\t\" FROM dbo.Customers \" +\n\t\t\t\t\" INNER JOIN dbo.Orders \"+\n\t\t\t\t\"        USING ID\" +\n\t\t\t\t\" WHERE \"+\n\t\t\t\t\"   Orders.ID IN ( SELECT ID FROM LatestOrders )\"+\n\t\t\t\t\"\tAND Orders.n_items \u003e ? \";\n  \n````\n\n* In fluent SQL:\n\n````java\n\n    SQL sql = WITH(\"LatestOrders\" , \n\t\t\t\t\t\t\tSELECT(\"CustomerName\")\n\t\t\t\t\t\t\t.FN(SUM(COUNT(\"ID\")))\n\t\t\t\t\t\t\t.FN(COUNT(MAX(\"n_items\")))\n\t\t\t\t\t\t\t.FIELD(\"Red\").AS(\"color\")\n\t\t\t\t\t\t\t.FROM(\"dbo.Orders\")\n\t\t\t\t\t\t\t.RIGHT_JOIN(\"Customers\")\n\t\t\t\t\t\t\t\t.ON(\"Orders.customer_ID\" , \"Customers.ID\")\n\t\t\t\t\t\t\t.LEFT_JOIN(\"Persons\")\n\t\t\t\t\t\t\t\t.ON(\"Persons.name\" , \"Customer.name\")\n\t\t\t\t\t\t\t\t.AND_ON(\"Persons.lastName\" , \"Customer.lastName\")\n\t\t\t\t\t\t\t.GROUP_BY(\"CustomerID\")\n\t\t\t)\n\t\t\t.append(SELECT()\n\t\t\t\t.FIELD(\"Customers.*\")\n\t\t\t\t.FIELD(\"Orders.OrderTime\").AS(\"LatestOrderTime\")\n\t\t\t\t.FIELD(SELECT(COUNT(\"*\"))\n\t\t\t\t\t\t\t.FROM(\"dbo.OrderItems\")\n\t\t\t\t\t\t\t.WHERE(\"OrderID\").IN(\n\t\t\t\t\t\t\t\t\tSELECT(\"ID\")\n\t\t\t\t\t\t\t\t\t\t.FROM(\"dbo.Orders\")\n\t\t\t\t\t\t\t\t\t\t.WHERE(\"CustomerID\").EQUAL_TO_FIELD(\"Customers.ID\"))\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t).AS(\"TotalItemsPurchased\")\n\t\t\t\t.FROM(\"dbo.Customers\")\n\t\t\t\t.INNER_JOIN(\"dbo.Orders\")\n\t\t\t\t\t.USING(\"ID\")\n\t\t\t\t.WHERE(\"Orders.ID\").IN(SELECT(\"ID\").FROM(\"LatestOrders\"))\n\t\t\t\t.AND(\"Orders.n_items\").GREATER_THAN(0)\n\t\t\t\t);\n\t\t\n\t\tBreakdown actual = sql.build();\n      \n````      \n## What it is:\n * A clever usage of Java Static methods to write your SQL statement just as what you would expect.\n * Easily write your SQL in java.\n * It has almost no logic other than appending the SQL statements just like StringBuilder, and appending commas when it is obvious.\n \n\n## What it is NOT\n * It is not an automatic SQL builder that will automagically transform SQL strings to work accross multi-database platform.\n \n## What it is used for\n * It is used by programmers who would rather write SQL statements than use ORM that gets in their way.\n  \n \n\n\n### Features\n\n\nA SQL breakdown result:\n * breakdown.getSql() (String) - the SQL string built\n * breakdown.getParameters() (Object[]) - the resulted array of the parameters that is gathered by the SQL builder, with the correct order as they are mentioned in the query\n\tThis will be used in as parameters in your preparedStatment \n * stmt.setObject(i,parameter[i]), in turn SQL injection is already mitigated\n\n\n\n## The keyword `SUPER AWESOME JOIN` that I want to use is not there.\n\n * You can use the keyword API\n \t\n ```java\n SQL = SELECT(\"name\", \"description\").FROM(\"mytable\").\n \t\t\tkeyword(\" SUPER AWESOME JOIN \").append(\"table3\")\n \t\t\t.ON(\"column1\", \"column2\");\n ```\n \n * You can incorporate it into the [SQL.java](https://github.com/ivanceras/fluentsql/blob/master/src/main/java/com/ivanceras/fluent/sql/SQL.java) class\n\n### Usage\n\n* Simplest Usage:\n\u003eCopy these 2 files [here](https://github.com/ivanceras/fluentsql/tree/master/src/main/java/com/ivanceras/fluent/sql).\n  Make it as part of your source code, so you can easily modify and add keywords intended for your Database platform.\n \n\n* Maven project, If you are just using keywords that are already in there!\n\n```xml\n\n\u003cdependency\u003e\n\t\u003cgroupId\u003ecom.ivanceras\u003c/groupId\u003e\n\t\u003cartifactId\u003efluentsql\u003c/artifactId\u003e\n\t\u003cversion\u003e0.0.6\u003c/version\u003e\n\u003c/dependency\u003e\n\n```\n\n    \n### Projects using it\n\n* [Ivanceras ORM](https://github.com/ivanceras/orm)\n\n\u003e Take a look at the code in action [here](https://github.com/ivanceras/orm/blob/master/src/main/java/com/ivanceras/db/api/DB_Rdbms.java)\n\n\n\n\n### link to previous HN comments submission\n\nhttps://news.ycombinator.com/item?id=5956867\n\n\n\n#### More examples\n\nhttps://github.com/ivanceras/fluentsql/tree/master/src/test/java/com/ivanceras/fluent\n\n\n#### Similar Projects\n\nhttp://www.jooq.org/  ( This is polished but I wanted CAPSLOCK on the SQL keywords, also it automatically transform SQL statements for each platform )\n\nhttp://code.google.com/p/squiggle-sql/  ( ..uhmm.. poor choice of words.. )\n\n### License\nApache2\n\n### How can I help?\n* [Fork me](https://github.com/ivanceras/fluentsql)\n* [Submit Issues, Suggestions](https://github.com/ivanceras/fluentsql/issues)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fivanceras%2Ffluentsql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fivanceras%2Ffluentsql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fivanceras%2Ffluentsql/lists"}