Skip to content
Konstantin Triger edited this page Aug 4, 2019 · 23 revisions

Purpose

FluentJPA provides fluent API for writing type-safe Object Oriented SQL queries with JPA.

FluentJPA.SQL()

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:

    // assign the lambda parameters names that make clear their purpose in the context of this query.
    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()));
    
    });
    • Declaring entities as parameters makes clear the scope of the query
    • In Java entity represents SQL Table or more generally a result set
  • 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. So 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()

How does it work?

  • 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.

SQL Support

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.

Java Support

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