Giter VIP home page Giter VIP logo

joou's Introduction

jOOQ

jOOQ is an internal DSL and source code generator, modelling the SQL language as a type safe Java API to help you write better SQL.

Its main features include:

Secondary features include:

Examples

Typesafe, embedded SQL

jOOQ's main feature is typesafe, embedded SQL, allowing for IDE auto completion of SQL syntax...

image

... as well as of schema meta data:

image

This allows for preventing errors of various types, including typos of identifiers:

image

Or data type mismatches:

image

The examples are from the code generation blog post.

A more powerful example using nested collections

For many more examples, please have a look at the demo. A key example showing jOOQ's various strengths is from the MULTISET operator announcement blog post:

Given these target DTOs:

record Actor(String firstName, String lastName) {}
record Film(
  String title,
  List<Actor> actors,
  List<String> categories
) {}

You can now write the following query to fetch films, their nested actors and their nested categorise in a single, type safe query:

List<Film> result =
dsl.select(
      FILM.TITLE,
      multiset(
        select(
          FILM.actor().FIRST_NAME, 
          FILM.actor().LAST_NAME)
        .from(FILM.actor())
      ).as("actors").convertFrom(r -> r.map(mapping(Actor::new))),
      multiset(
        select(FILM.category().NAME)
        .from(FILM.category())
      ).as("categories").convertFrom(r -> r.map(Record1::value1))
   )
   .from(FILM)
   .orderBy(FILM.TITLE)
   .fetch(mapping(Film::new));

The query is completely type safe. Change a column type, name, or the target DTO, and it will stop compiling! Trust only your own eyes:

multiset

And here you see the nested result in action from the logs:

execute

How does it work? Look at this annotated example:

List<Film> result =
dsl.select(
      FILM.TITLE,

      // MULTISET is a standard SQL operator that allows for nesting collections
      // directly in SQL. It is either
      // - supported natively
      // - emulated using SQL/JSON or SQL/XML
      multiset(

        // Implicit path based joins allow for simpler navigation of foreign
        // key relationships.
        select(
          FILM.actor().FIRST_NAME, 
          FILM.actor().LAST_NAME)

        // Implicit correlation to outer queries allows for avoiding repetitive
        // writing of predicates.
        .from(FILM.actor())

      // Ad-hoc conversion allows for mapping structural Record2<String, String>
      // types to your custom DTO using constructor references
      ).as("actors").convertFrom(r -> r.map(mapping(Actor::new))),
      multiset(
        select(FILM.category().NAME)
        .from(FILM.category())
      ).as("categories").convertFrom(r -> r.map(Record1::value1))
   )
   .from(FILM)
   .orderBy(FILM.TITLE)
   .fetch(mapping(Film::new));

The generated SQL query might look like this, in PostgreSQL:

select
  film.title,
  (
    select coalesce(
      jsonb_agg(jsonb_build_object(
        'first_name', t.first_name,
        'last_name', t.last_name
      )),
      jsonb_build_array()
    )
    from (
      select
        alias_78509018.first_name, 
        alias_78509018.last_name
      from (
        film_actor
          join actor as alias_78509018
            on film_actor.actor_id = alias_78509018.actor_id
        )
      where film_actor.film_id = film.film_id
    ) as t
  ) as actors,
  (
    select coalesce(
      jsonb_agg(jsonb_build_object('name', t.name)),
      jsonb_build_array()
    )
    from (
      select alias_130639425.name
      from (
        film_category
          join category as alias_130639425
            on film_category.category_id = alias_130639425.category_id
        )
      where film_category.film_id = film.film_id
    ) as t
  ) as categories
from film
order by film.title

This particular example is explained more in detail in the MULTISET operator announcement blog post. For many more examples, please have a look at the demo.

joou's People

Contributors

bhchandra avatar dependabot[bot] avatar jensnercheke avatar knutwannheden avatar lukaseder avatar schallee avatar sirikid avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

joou's Issues

Improved hashCode() and toString() implementation

The current implementation on e.g. UByte.toString() is:

    @Override
    public String toString() {
        return Short.valueOf(value).toString();
    }

This produces an unnecessary allocation of a java.lang.Short, when instead, we could write

    @Override
    public String toString() {
        return Short.toString(value);
    }

Other types are also affected.

Credits to @knutwannheden for discovering this.

Modularise jOOU and cross-release a Java 6 and Java 9 deliverable

Similar to jOOQ, jOOR, and jOOX we should cross-release jOOU in order to be able to deliver it as a Java 9 module.

Since we're currently not doing anything specific to Java 8, a Java 8 deliverable is not necessary. We can still add such an artifact later on, if we're adding anything specific to Java 8

Can't add the library into my Android Studio Project

Hi,
I tried importing this library into my Android project, but when I try to run my app, I have the following error :

FATAL EXCEPTION: main
Process: sevrain.test, PID: 6133
java.lang.NoClassDefFoundError: Failed resolution of: Lorg/joou/UByte;
at sevrain.test.Reglages.concatenateByteArray(Reglages.java:142)
at sevrain.test.MainActivity$4.onClick(MainActivity.java:123)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.ClassNotFoundException: Didn't find class "org.joou.UByte" on path: DexPathList[[dex file "/data/data/sevrain.test/files/instant-run/dex/slice-support-annotations-23.3.0_5d2ef72a253a42531cccf688b31bc628a56ee084-classes.dex", dex file "/data/data/sevrain.test/files/instant-run/dex/slice-slice_9-classes.dex", dex file "/data/data/sevrain.test/files/instant-run/dex/slice-slice_8-classes.dex", dex file "/data/data/sevrain.test/files/instant-run/dex/slice-slice_7-classes.dex", dex file "/data/data/sevrain.test/files/instant-run/dex/slice-slice_6-classes.dex", dex file "/data/data/sevrain.test/files/instant-run/dex/slice-slice_5-classes.dex", dex file "/data/data/sevrain.test/files/instant-run/dex/slice-slice_4-classes.dex", dex file "/data/data/sevrain.test/files/instant-run/dex/slice-slice_3-classes.dex", dex file "/data/data/sevrain.test/files/instant-run/dex/slice-slice_2-classes.dex", dex file "/data/data/sevrain.test/files/instant-run/dex/slice-slice_1-classes.dex", dex file "/data/data/sevrain.test/files/instant-run/dex/slice-slice_0-classes.dex", dex file "/data/data/sevrain.test/files/instant-run/dex/slice-internal_impl-23.3.0_f0e052e442ee65b2a8a47f38f0f7af896de29339-classes.dex", dex file "/data/data/sevrain.test/files/instant-run/dex/slice-com.android.support-support-vector-drawable-23.3.0_010360adcd346090b0f9993e30fbd326f7ddc57e-classes.dex", dex file "/data/data/sevrain.test/files/instant-run/dex/slice-com.android.support-support-v4-23.3.0_0c2c65f8dc40f972d7bc08d58d2ec924d7fbb521-classes.dex", dex file "/data/data/sevrain.test/files/instant-run/dex/slice-com.android.support-appcompat-v7-23.3.0_02f1a8f82ff0c034bf1ca6149868d85ee2aa885e-classes.dex", dex file "/data/data/sevrain.test/files/instant-run/dex/slice-com.android.support-animated-vector-drawable-23.3.0_3fd5e9b04805488b8abc2dd11d113f60580edf7d-classes.dex"],nativeLibraryDirectories=[/data/app/sevrain.test-1/lib/x86, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at com.android.tools.fd.runtime.IncrementalClassLoader$DelegateClassLoader.findClass(IncrementalClassLoader.java:90)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at sevrain.test.Reglages.concatenateByteArray(Reglages.java:142) 
at sevrain.test.MainActivity$4.onClick(MainActivity.java:123) 
at android.view.View.performClick(View.java:5198) 
at android.view.View$PerformClick.run(View.java:21147) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5417) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
Suppressed: java.lang.ClassNotFoundException: Didn't find class "org.joou.UByte" on path: DexPathList[[zip file "/data/app/sevrain.test-1/base.apk"],nativeLibraryDirectories=[/data/app/sevrain.test-1/lib/x86, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 12 more
Suppressed: java.lang.ClassNotFoundException: Didn't find class "org.joou.UByte" on path: DexPathList[[dex file "/data/data/sevrain.test/files/instant-run/dex/slice-support-annotations-23.3.0_5d2ef72a253a42531cccf688b31bc628a56ee084-classes.dex", dex file "/data/data/sevrain.test/files/instant-run/dex/slice-slice_9-classes.dex", dex file "/data/data/sevrain.test/files/instant-run/dex/slice-slice_8-classes.dex", dex file "/data/data/sevrain.test/files/instant-run/dex/slice-slice_7-classes.dex", dex file "/data/data/sevrain.test/files/instant-run

I added the library using "Library dependencies" and i searched for jOOU, it added the following line into my gradle file :

compile 'org.jooq:joou:0.9.1'

Add a byte array output

The main advantage, for me, to have unsigned primitives, is to permit a byte array output of the unsigned number.

UInteger range inconsistencies

Unsigned integer range handling has incorrectnesses / inconsistencies.

E.g. UInteger can be formed from integer -34 but not from long -34.

@Test
public void test_negative_uint_34il() {
    UInteger a = uint(-34);
    UInteger b = uint(-34L);
    assertTrue (a == b);
}

Reported error is Exception in thread "main" java.lang.NumberFormatException: Value is out of range : -34 for the b definition.

I would either expect both of the samples below to fail or succeed, but not act differently. What is the intent in this library? Shouldn't both these cases succeed, since -34 is a value that is representable in 32 bit signed integer?

glm/UMath better support

Hi,

first of all, let me say it is a really cool project!

Second, we are working on a java glm here and at the moment I am implementing all the unsigned types, Vec2ub, Vec2ui, and so on

I am really interested in jOOU and I was wondering if it'd be possible to facilitate my task by implementing additional methods such as min(uX, uY), max(uX, uY) in a, let's say, UMath class...

For info, I am currently implementing such a class, but it'd be cool I could move it inside jOOU :)

Storing UByte[] in mysql

Expected behavior and actual behavior:

I get an error saying: Incorrect string value: '\x00\x00...' for column ...

Steps to reproduce the problem:

Create a JPA entity with a field of type UByte[] and persist it

Versions:

  • jOOU:
    joou-java-6 / 0.9.3
  • Java:
    openJdk 8

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.