Intro
A single utility class for writing HQL in more readable way. Simplifies writing multiline queries, and queries that have optional parts depending on parameter values (like API adding extra filter by date if supplied date != null).
The utility
For now, this not published as a maven library. Just copy the utility class HqlBuilder.java
from hql-query-builder to your project. If you like it, but not 100%, just tweak it to your own coding style.
Rant: I both love and hate(more) Hibernate. I try to avoid it, but that is not always possible. Technologically Hibernate is great , and has sooo many features. For the same reason it is also is a huge bloat, slows down start-up, does freaky bytecode manipulation, and is pain in the ass so many times. Takes a ton of time to learn and obscures learning actual SQL.
Basic comparison and sample use
Standard way to write HQL is ok for smaller queries, but gets ugly very quickly.
<span>Query</span> <span>q</span> <span>=</span> <span>session</span><span>.</span><span>createQuery</span><span>(</span><span>"SELECT id FROM Adddress WHERE userId = :userId AND houseNo > :houseNo"</span><span>)</span><span>q</span><span>.</span><span>setParameter</span><span>(</span><span>"userId"</span><span>,</span> <span>userId</span><span>);</span><span>q</span><span>.</span><span>setParameter</span><span>(</span><span>"houseNo"</span><span>,</span> <span>2L</span><span>);</span><span>Query</span> <span>q</span> <span>=</span> <span>session</span><span>.</span><span>createQuery</span><span>(</span> <span>"SELECT id FROM Adddress WHERE userId = :userId AND houseNo > :houseNo"</span><span>)</span> <span>q</span><span>.</span><span>setParameter</span><span>(</span><span>"userId"</span><span>,</span> <span>userId</span><span>);</span> <span>q</span><span>.</span><span>setParameter</span><span>(</span><span>"houseNo"</span><span>,</span> <span>2L</span><span>);</span>Query q = session.createQuery( "SELECT id FROM Adddress WHERE userId = :userId AND houseNo > :houseNo") q.setParameter("userId", userId); q.setParameter("houseNo", 2L);
Enter fullscreen mode Exit fullscreen mode
This style is also supported by HqlBuilder
(but it allows much more)
<span>var</span> <span>hb</span> <span>=</span> <span>new</span> <span>HqlBuilder</span><span>(</span><span>"SELECT id FROM Adddress WHERE userId = :userId AND houseNo > :houseNo"</span><span>);</span><span>hb</span><span>.</span><span>p</span><span>(</span><span>"userId"</span><span>,</span> <span>userId</span><span>);</span><span>hb</span><span>.</span><span>p</span><span>(</span><span>"houseNo"</span><span>,</span> <span>2L</span><span>);</span><span>var</span> <span>hb</span> <span>=</span> <span>new</span> <span>HqlBuilder</span><span>(</span> <span>"SELECT id FROM Adddress WHERE userId = :userId AND houseNo > :houseNo"</span><span>);</span> <span>hb</span><span>.</span><span>p</span><span>(</span><span>"userId"</span><span>,</span> <span>userId</span><span>);</span> <span>hb</span><span>.</span><span>p</span><span>(</span><span>"houseNo"</span><span>,</span> <span>2L</span><span>);</span>var hb = new HqlBuilder( "SELECT id FROM Adddress WHERE userId = :userId AND houseNo > :houseNo"); hb.p("userId", userId); hb.p("houseNo", 2L);
Enter fullscreen mode Exit fullscreen mode
The above query can be written like this:
<span>var</span> <span>hb</span> <span>=</span> <span>new</span> <span>HqlBuilder</span><span>();</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>"SELECT id"</span><span>);</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>"FROM Adddress"</span><span>);</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>"WHERE"</span><span>);</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>" userId = :userId"</span><span>,</span> <span>userId</span><span>);</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>" AND houseNo > :houseNo"</span><span>,</span> <span>2L</span><span>);</span><span>var</span> <span>hb</span> <span>=</span> <span>new</span> <span>HqlBuilder</span><span>();</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>"SELECT id"</span><span>);</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>"FROM Adddress"</span><span>);</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>"WHERE"</span><span>);</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>" userId = :userId"</span><span>,</span> <span>userId</span><span>);</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>" AND houseNo > :houseNo"</span><span>,</span> <span>2L</span><span>);</span>var hb = new HqlBuilder(); hb.add("SELECT id"); hb.add("FROM Adddress"); hb.add("WHERE"); hb.add(" userId = :userId", userId); hb.add(" AND houseNo > :houseNo", 2L);
Enter fullscreen mode Exit fullscreen mode
in a way that allows more formatting options for readability, and also placing parameter values close to where they are used in the query itself.
Each call to add
puts a newline before each line(except the first), so, for the code above, HQL will look like this:
<span>SELECT</span> <span>id</span><span>FROM</span> <span>Adddress</span><span>WHERE</span><span>userId</span> <span>=</span> <span>:</span><span>userId</span><span>AND</span> <span>houseNo</span> <span>></span> <span>:</span><span>houseNo</span><span>SELECT</span> <span>id</span> <span>FROM</span> <span>Adddress</span> <span>WHERE</span> <span>userId</span> <span>=</span> <span>:</span><span>userId</span> <span>AND</span> <span>houseNo</span> <span>></span> <span>:</span><span>houseNo</span>SELECT id FROM Adddress WHERE userId = :userId AND houseNo > :houseNo
Enter fullscreen mode Exit fullscreen mode
Debug and logging
You can get the query that is going into hibernate by calling hb.getQueryString()
and you will get the query above.
You can also dump what query with values looks like with hb.toString()
. Not actual SQL that will go into database, just an approximation where parameter placeholders are replaced with values(NULL for null values, and for other .toString()
)
<span>SELECT</span> <span>id</span><span>,</span><span>street</span><span>,</span><span>city</span><span>FROM</span> <span>Adddress</span><span>WHERE</span><span>userId</span> <span>=</span> <span>11</span><span>AND</span> <span>houseNo</span> <span>></span> <span>2</span><span>SELECT</span> <span>id</span><span>,</span><span>street</span><span>,</span><span>city</span> <span>FROM</span> <span>Adddress</span> <span>WHERE</span> <span>userId</span> <span>=</span> <span>11</span> <span>AND</span> <span>houseNo</span> <span>></span> <span>2</span>SELECT id,street,city FROM Adddress WHERE userId = 11 AND houseNo > 2
Enter fullscreen mode Exit fullscreen mode
You can improve this output by implementing more logic into valueToString
method.
Executing the query using Hibernate
When you finish building the desired HQL, just call .build(session)
or .build(session, resultType)
to create a Hibernate Query object (that you can then use to list results)
<span>hb</span><span>.</span><span>build</span><span>(</span><span>session</span><span>,</span> <span>Long</span><span>.</span><span>class</span><span>).</span><span>list</span><span>()</span><span>hb</span><span>.</span><span>build</span><span>(</span><span>session</span><span>,</span> <span>Long</span><span>.</span><span>class</span><span>).</span><span>list</span><span>()</span>hb.build(session, Long.class).list()
Enter fullscreen mode Exit fullscreen mode
More details on .add
The builder can be constructed empty, or with parameters (it is just alias to .add
)
<span>var</span> <span>hb</span> <span>=</span> <span>new</span> <span>HqlBuilder</span><span>();</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>"SELECT * FROM User"</span><span>);</span><span>// is same as</span><span>var</span> <span>hb</span> <span>=</span> <span>new</span> <span>HqlBuilder</span><span>(</span><span>"SELECT * FROM User"</span><span>);</span><span>var</span> <span>hb</span> <span>=</span> <span>new</span> <span>HqlBuilder</span><span>();</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>"SELECT * FROM User"</span><span>);</span> <span>// is same as</span> <span>var</span> <span>hb</span> <span>=</span> <span>new</span> <span>HqlBuilder</span><span>(</span><span>"SELECT * FROM User"</span><span>);</span>var hb = new HqlBuilder(); hb.add("SELECT * FROM User"); // is same as var hb = new HqlBuilder("SELECT * FROM User");
Enter fullscreen mode Exit fullscreen mode
So, the further examples we will be for .add
method
Add just a new query part (with or without parameter placeholders)
<span>hb</span><span>.</span><span>add</span><span>(</span><span>"FROM User"</span><span>);</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>"FROM User"</span><span>);</span>hb.add("FROM User");
Enter fullscreen mode Exit fullscreen mode
Add query part with parameters and values
<span>hb</span><span>.</span><span>add</span><span>(</span><span>"WHERE userId = :userId"</span><span>,</span> <span>userId</span><span>);</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>"WHERE userId = :userId"</span><span>,</span> <span>userId</span><span>);</span>hb.add("WHERE userId = :userId", userId);
Enter fullscreen mode Exit fullscreen mode
If you are providing values for parameters, you must match count of parameters in query part. Either provide all parameter values, or provide none (and define them later using .p
).
Add a new query part with parameter placeholders, and provide parameter values separately)
<span>hb</span><span>.</span><span>add</span><span>(</span><span>" AND city = :city"</span><span>);</span><span>hb</span><span>.</span><span>p</span><span>(</span><span>"city"</span><span>,</span> <span>city</span><span>);</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>" AND city = :city"</span><span>);</span> <span>hb</span><span>.</span><span>p</span><span>(</span><span>"city"</span><span>,</span> <span>city</span><span>);</span>hb.add(" AND city = :city"); hb.p("city", city);
Enter fullscreen mode Exit fullscreen mode
Hibernate HQL works nice with records
As you can give a record to Hibernate Query to fill it with query results, this gives a nice way of working with selected data (this is part of Hibernate, not a feature added by this utility).
<span>// Address entity has many more fields, here we define those that we plan to select</span><span>public</span> <span>record</span> <span>AddressPart</span><span>(</span><span>Long</span> <span>id</span><span>,</span> <span>String</span> <span>street</span><span>,</span> <span>String</span> <span>city</span><span>){};</span><span>public</span> <span>List</span><span><</span><span>AddressPart</span><span>></span> <span>getUserAddresses</span><span>(</span><span>Long</span> <span>userId</span><span>){</span><span>var</span> <span>hb</span> <span>=</span> <span>new</span> <span>HqlBuilder</span><span>();</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>"SELECT id,street,city"</span><span>);</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>"FROM Adddress"</span><span>);</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>"WHERE"</span><span>);</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>" userId = :userId"</span><span>,</span> <span>userId</span><span>);</span><span>Session</span> <span>session</span> <span>=</span> <span>...;</span><span>// obtain hibernate session in your app</span><span>return</span> <span>hb</span><span>.</span><span>build</span><span>(</span><span>session</span><span>,</span> <span>AddressPart</span><span>.</span><span>class</span><span>).</span><span>list</span><span>()</span><span>}</span><span>// Address entity has many more fields, here we define those that we plan to select</span> <span>public</span> <span>record</span> <span>AddressPart</span><span>(</span><span>Long</span> <span>id</span><span>,</span> <span>String</span> <span>street</span><span>,</span> <span>String</span> <span>city</span><span>){};</span> <span>public</span> <span>List</span><span><</span><span>AddressPart</span><span>></span> <span>getUserAddresses</span><span>(</span><span>Long</span> <span>userId</span><span>){</span> <span>var</span> <span>hb</span> <span>=</span> <span>new</span> <span>HqlBuilder</span><span>();</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>"SELECT id,street,city"</span><span>);</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>"FROM Adddress"</span><span>);</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>"WHERE"</span><span>);</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>" userId = :userId"</span><span>,</span> <span>userId</span><span>);</span> <span>Session</span> <span>session</span> <span>=</span> <span>...;</span><span>// obtain hibernate session in your app</span> <span>return</span> <span>hb</span><span>.</span><span>build</span><span>(</span><span>session</span><span>,</span> <span>AddressPart</span><span>.</span><span>class</span><span>).</span><span>list</span><span>()</span> <span>}</span>// Address entity has many more fields, here we define those that we plan to select public record AddressPart(Long id, String street, String city){}; public List<AddressPart> getUserAddresses(Long userId){ var hb = new HqlBuilder(); hb.add("SELECT id,street,city"); hb.add("FROM Adddress"); hb.add("WHERE"); hb.add(" userId = :userId", userId); Session session = ...;// obtain hibernate session in your app return hb.build(session, AddressPart.class).list() }
Enter fullscreen mode Exit fullscreen mode
More examples
A query that has optional name filter. If name is not provided, name filter is not added to query.
<span>public</span> <span>List</span><span><</span><span>User</span><span>></span> <span>getUsers</span><span>(</span><span>String</span> <span>name</span><span>){</span><span>var</span> <span>hb</span> <span>=</span> <span>new</span> <span>HqlBuilder</span><span>();</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>"FROM User"</span><span>);</span><span>// HQL when selecting whole entities only needs FROM</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>"WHERE"</span><span>);</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>" deleted = :deleted"</span><span>,</span> <span>false</span><span>);</span><span>if</span><span>(</span><span>name</span> <span>!=</span> <span>null</span> <span>&&</span> <span>!</span><span>name</span><span>.</span><span>isEmpty</span><span>()){</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>" name LIKE :name"</span><span>,</span> <span>"%"</span><span>+</span><span>name</span><span>+</span><span>"%"</span><span>);</span><span>}</span><span>Session</span> <span>session</span> <span>=</span> <span>...;</span><span>// obtain hibernate session in your app</span><span>return</span> <span>hb</span><span>.</span><span>build</span><span>(</span><span>session</span><span>,</span> <span>User</span><span>.</span><span>class</span><span>).</span><span>list</span><span>()</span><span>}</span><span>public</span> <span>List</span><span><</span><span>User</span><span>></span> <span>getUsers</span><span>(</span><span>String</span> <span>name</span><span>){</span> <span>var</span> <span>hb</span> <span>=</span> <span>new</span> <span>HqlBuilder</span><span>();</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>"FROM User"</span><span>);</span><span>// HQL when selecting whole entities only needs FROM</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>"WHERE"</span><span>);</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>" deleted = :deleted"</span><span>,</span> <span>false</span><span>);</span> <span>if</span><span>(</span><span>name</span> <span>!=</span> <span>null</span> <span>&&</span> <span>!</span><span>name</span><span>.</span><span>isEmpty</span><span>()){</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>" name LIKE :name"</span><span>,</span> <span>"%"</span><span>+</span><span>name</span><span>+</span><span>"%"</span><span>);</span> <span>}</span> <span>Session</span> <span>session</span> <span>=</span> <span>...;</span><span>// obtain hibernate session in your app</span> <span>return</span> <span>hb</span><span>.</span><span>build</span><span>(</span><span>session</span><span>,</span> <span>User</span><span>.</span><span>class</span><span>).</span><span>list</span><span>()</span> <span>}</span>public List<User> getUsers(String name){ var hb = new HqlBuilder(); hb.add("FROM User");// HQL when selecting whole entities only needs FROM hb.add("WHERE"); hb.add(" deleted = :deleted", false); if(name != null && !name.isEmpty()){ hb.add(" name LIKE :name", "%"+name+"%"); } Session session = ...;// obtain hibernate session in your app return hb.build(session, User.class).list() }
Enter fullscreen mode Exit fullscreen mode
Dilemma 1: parameters without name
Not sure if it s good or bad to use the builder like this, but I could not help but to allow this use-case. If you just use :
without defining parameter name, then values are required at the .add
method call.
<span>var</span> <span>hb</span> <span>=</span> <span>new</span> <span>HqlBuilder</span><span>();</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>"SELECT id,street,city"</span><span>);</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>"FROM Adddress"</span><span>);</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>"WHERE"</span><span>);</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>" userId = :"</span><span>,</span> <span>userId</span><span>);</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>" AND houseNo > :"</span><span>,</span> <span>2L</span><span>);</span><span>var</span> <span>hb</span> <span>=</span> <span>new</span> <span>HqlBuilder</span><span>();</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>"SELECT id,street,city"</span><span>);</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>"FROM Adddress"</span><span>);</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>"WHERE"</span><span>);</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>" userId = :"</span><span>,</span> <span>userId</span><span>);</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>" AND houseNo > :"</span><span>,</span> <span>2L</span><span>);</span>var hb = new HqlBuilder(); hb.add("SELECT id,street,city"); hb.add("FROM Adddress"); hb.add("WHERE"); hb.add(" userId = :", userId); hb.add(" AND houseNo > :", 2L);
Enter fullscreen mode Exit fullscreen mode
For the code above, HQL will look like this:
<span>SELECT</span> <span>id</span><span>,</span><span>street</span><span>,</span><span>city</span><span>FROM</span> <span>Adddress</span><span>WHERE</span><span>userId</span> <span>=</span> <span>:</span><span>_param_1</span><span>AND</span> <span>houseNo</span> <span>></span> <span>:</span><span>_param_2</span><span>SELECT</span> <span>id</span><span>,</span><span>street</span><span>,</span><span>city</span> <span>FROM</span> <span>Adddress</span> <span>WHERE</span> <span>userId</span> <span>=</span> <span>:</span><span>_param_1</span> <span>AND</span> <span>houseNo</span> <span>></span> <span>:</span><span>_param_2</span>SELECT id,street,city FROM Adddress WHERE userId = :_param_1 AND houseNo > :_param_2
Enter fullscreen mode Exit fullscreen mode
Dilemma 2: conditional code formatting
I would like to keep consistent visual formatting of indent in conditional statements. Example of such is:
<span>var</span> <span>hb</span> <span>=</span> <span>new</span> <span>HqlBuilder</span><span>();</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>"FROM User"</span><span>);</span><span>// HQL when selecting whole entities only needs FROM</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>"WHERE"</span><span>);</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>" deleted = :deleted"</span><span>,</span> <span>false</span><span>);</span><span>if</span><span>(</span><span>name</span> <span>!=</span> <span>null</span> <span>&&</span> <span>!</span><span>name</span><span>.</span><span>isEmpty</span><span>()){</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>" name LIKE :name"</span><span>,</span> <span>"%"</span><span>+</span><span>name</span><span>+</span><span>"%"</span><span>);</span><span>}</span><span>var</span> <span>hb</span> <span>=</span> <span>new</span> <span>HqlBuilder</span><span>();</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>"FROM User"</span><span>);</span><span>// HQL when selecting whole entities only needs FROM</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>"WHERE"</span><span>);</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>" deleted = :deleted"</span><span>,</span> <span>false</span><span>);</span> <span>if</span><span>(</span><span>name</span> <span>!=</span> <span>null</span> <span>&&</span> <span>!</span><span>name</span><span>.</span><span>isEmpty</span><span>()){</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>" name LIKE :name"</span><span>,</span> <span>"%"</span><span>+</span><span>name</span><span>+</span><span>"%"</span><span>);</span> <span>}</span>var hb = new HqlBuilder(); hb.add("FROM User");// HQL when selecting whole entities only needs FROM hb.add("WHERE"); hb.add(" deleted = :deleted", false); if(name != null && !name.isEmpty()){ hb.add(" name LIKE :name", "%"+name+"%"); }
Enter fullscreen mode Exit fullscreen mode
Now that if
statement moves/confuses the indent of the HQL slightly. This is not a huge issue, but it bothers me. I have not found perfect solution, but am playing with few ideas.
One idea is to move java code indent back:
<span>var</span> <span>hb</span> <span>=</span> <span>new</span> <span>HqlBuilder</span><span>();</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>"FROM User"</span><span>);</span><span>FROM</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>"WHERE"</span><span>);</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>" deleted = :deleted"</span><span>,</span> <span>false</span><span>);</span><span>if</span><span>(</span><span>name</span> <span>!=</span> <span>null</span> <span>&&</span> <span>!</span><span>name</span><span>.</span><span>isEmpty</span><span>()){</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>" name LIKE :name"</span><span>,</span> <span>"%"</span><span>+</span><span>name</span><span>+</span><span>"%"</span><span>);</span><span>}</span><span>var</span> <span>hb</span> <span>=</span> <span>new</span> <span>HqlBuilder</span><span>();</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>"FROM User"</span><span>);</span><span>FROM</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>"WHERE"</span><span>);</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>" deleted = :deleted"</span><span>,</span> <span>false</span><span>);</span> <span>if</span><span>(</span><span>name</span> <span>!=</span> <span>null</span> <span>&&</span> <span>!</span><span>name</span><span>.</span><span>isEmpty</span><span>()){</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>" name LIKE :name"</span><span>,</span> <span>"%"</span><span>+</span><span>name</span><span>+</span><span>"%"</span><span>);</span> <span>}</span>var hb = new HqlBuilder(); hb.add("FROM User");FROM hb.add("WHERE"); hb.add(" deleted = :deleted", false); if(name != null && !name.isEmpty()){ hb.add(" name LIKE :name", "%"+name+"%"); }
Enter fullscreen mode Exit fullscreen mode
Another idea is utility function in the builder (but it works only for one line of HQL)
<span>var</span> <span>hb</span> <span>=</span> <span>new</span> <span>HqlBuilder</span><span>();</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>"FROM User"</span><span>);</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>"WHERE"</span><span>);</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>" deleted = :deleted"</span><span>,</span> <span>false</span><span>);</span><span>hb</span><span>.</span><span>addNextIf</span><span>(</span><span>name</span> <span>!=</span> <span>null</span> <span>&&</span> <span>!</span><span>name</span><span>.</span><span>isEmpty</span><span>());</span><span>hb</span><span>.</span><span>add</span><span>(</span><span>" name LIKE :name"</span><span>,</span> <span>"%"</span><span>+</span><span>name</span><span>+</span><span>"%"</span><span>);</span><span>var</span> <span>hb</span> <span>=</span> <span>new</span> <span>HqlBuilder</span><span>();</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>"FROM User"</span><span>);</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>"WHERE"</span><span>);</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>" deleted = :deleted"</span><span>,</span> <span>false</span><span>);</span> <span>hb</span><span>.</span><span>addNextIf</span><span>(</span><span>name</span> <span>!=</span> <span>null</span> <span>&&</span> <span>!</span><span>name</span><span>.</span><span>isEmpty</span><span>());</span> <span>hb</span><span>.</span><span>add</span><span>(</span><span>" name LIKE :name"</span><span>,</span> <span>"%"</span><span>+</span><span>name</span><span>+</span><span>"%"</span><span>);</span>var hb = new HqlBuilder(); hb.add("FROM User"); hb.add("WHERE"); hb.add(" deleted = :deleted", false); hb.addNextIf(name != null && !name.isEmpty()); hb.add(" name LIKE :name", "%"+name+"%");
Enter fullscreen mode Exit fullscreen mode
暂无评论内容