-
Notifications
You must be signed in to change notification settings - Fork 10
Home
FluentJPA provides fluent API for writing type-safe Object Oriented SQL queries with JPA.
This is an "entry-point" method to the FluentJPA. It accepts a Java lambda and translates it to SQL query. There are few conventions:
-
Lambda parameters must be entity types. This way we declare the table references to be used in this query. Like in SQL, if there is a self join, there will be 2 parameters of the same entity type. For example:
FluentQuery query = FluentJPA.SQL((Staff emp, Staff manager, Store store) -> { // returns store name, employee first name and its manager first name // ordered by store and manager SELECT(store.getName(), emp.getFirstName(), manager.getFirstName()); FROM(emp).JOIN(manager).ON(emp.getManager() == manager) .JOIN(store).ON(emp.getStore() == store); ORDER(BY(emp.getStore()), BY(emp.getManager())); });
- In Java entity represents SQL Table or more generally a column set
- Having entities as parameters makes clear which tables this query works on
- Of course you never need to call this lambda - you only pass it to FluentJPA
-
In every place, where SQL expects a table reference (e.g.
FROM
), an entity should be passed. FluentJPA will read the required Table information via JPA annotations. -
FluentJPA translates Lambda's body SQL clauses (written in Java syntax) in the same order as they appear. Thus the content of the sample above is translated to exactly 3 lines:
SELECT t2.store_name, t0.first_name, t1.first_name FROM staffs AS t0 INNER JOIN staffs AS t1 ON (t0.manager_id = t1.staff_id) INNER JOIN stores AS t2 ON (t0.store_id = t2.store_id) ORDER BY t0.store_id, t0.manager_id
-
Finally, call
FluentQuery.createQuery()
to get a standard JPA Query instance (see JPA Integration for details):TypedQuery<X> typedQuery = query.createQuery(entityManager, <X>.class); // execute the query typedQuery.getResultList(); // or getSingleResult() / executeUpdate()
- Translation: FluentJPA reads the Java Byte Code from the .class files in runtime and translates it to SQL.
- SQL mapping: FluentJPA looks for special annotations on the methods. If found, it generates SQL-style "method call" for them. See Extensibility for more details.
FluentSQL declares most of the standard SQL DML including extensions provided by the 4 most popular databases, see static imports. Explore examples of Basic/Advanced SQL DML Statements from the sidebar
- All functions mapped to SQL counterparts follow SQL naming convention - capitals with underscores as delimiters.
- All the helper functions follow standard Java naming convention. They are either Library methods or Directives.
Most of the Java language is supported, see [[Java Language Support]
FluentJPA lets you create SQL with the same coding quality standards as rest of your code
Getting Started
- Introduction
- Setup
- Data Types
- Entities & Tuples
- Sub Queries
- JPA Integration
- Java Language Support
- Directives
- Library
- Returning Results
- JPA Repositories
Examples
Basic SQL DML Statements
Advanced SQL DML Statements
- Common Table Expressions (WITH Clause)
- Window Functions (OVER Clause)
- Aggregate Expressions
- MERGE
- Temporal Tables
Advanced Topics