Hibernate HQL builder

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

原文链接:Hibernate HQL builder

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
Forever facing sunlight, so you can not see the shadow of the.
永远面向阳光,这样你就看不见阴影了
评论 抢沙发

请登录后发表评论

    暂无评论内容