Convert Java 8 lambdas to SQL statements.
For example, the following Predicate:
person -> person.getAge() < 100 && person.getHeight() > 200
is converted to a string:
age < 100 AND height > 200
allowing you to write readable queries in a type safe way.
See Lambda2SqlTest for more examples or the Wiki.
int age = 100;
int height = 200;
SqlPredicate<Person> predicate = person -> person.getAge() < age && person.getHeight() > height;
String sql = Lambda2Sql.toSql(predicate); // age < 100 AND height > 200
It uses JaQue to build an expression tree for a lambda. The expression tree is then traversed and converted to a SQL statement.
Under the hood, JaQue depends on the system property jdk.internal.lambda.dumpProxyClasses
, if the lambda expression is not serialized:
See https://bugs.openjdk.java.net/browse/JDK-8023524.
When the property is enabled, JVM generated classes for lambdas are saved to disk. JaQue then uses ASM to read the .class files and creates expression trees.
Since the interface SqlPredicate<T>
is automatically serialized, there is no need to set this property.
Current version only works with predicates and supports the following operators: >, >=, <, <=, =, !=, &&, ||, !
You can get the library using JitPack https://jitpack.io/#ajermakovics/lambda2sql/0.7
repositories {
maven { url "https://jitpack.io" }
}
dependencies {
compile 'com.github.ajermakovics:lambda2sql:0.7'
}
gradle jar
or gradle fatjar
to include dependencies.