Cómo manejar el valor nulo del tipo de número en una consulta con nombre JPA

Quiero pasar dos parámetros a namedquery. Uno es el tipo de número y el otro es el tipo de cadena. Ambos podrían ser nulos.

Por ejemplo, (id = null, username = 'joe') y (id = 1, username = 'joe') son dos resultados diferentes. En namedQuery, la sintaxis es "u.id es nulo" si id es nulo, pero "u.id =: id" si id no es nulo. Mi pregunta es ¿cómo manejar dinámicamente la identificación archivada en namedQuery?

Por favor revise mi código de muestra:

1.User.java

@NamedQueries({
        @NamedQuery(name = "getUser", query = "select u from User u"
                + " where u.id = :id"    
                + " And u.username= :username")
})
public class User{
     public Long id;
     public String username;
}
UsuarioDao.java
public User getUser(Long id, String username) {
    TypedQuery<User> query = Dao.entityManager.createNamedQuery("getUser", User.class);
    query.setParameter("id", id);
    query.setParameter("username", username);

    List<User> users = query.getResultList();

    if (users.size() > 0) {
        return users.get(0);
    } else {
        return null;
    }
}

=======================================

Lo que he intentado:

Este es un código heredado y no quiero cambiar la estructura. Entonces no quiero usar Criteria.

seleccione u desde Usuario u donde (: id es nulo o u.id =: id) y u.username =: username

// lanzar excepción: tipos de datos inconsistentes: se esperaba NUMBER BINARY

seleccione u desde Usuario u donde u.id = nullif (: id, null) y u.username =: username

// Excepción de lanzamiento: tipos de datos inconsistentes: NUMBER esperado se BINARY

También probé nvl y decodificar en namedQuery, no funcionó.

query.setParameter ("id", id == null? -1: id) // no funcionó.

Mi última opción será escribir una consulta en el archivo UserDao para reemplazar namedQuery en el archivo User.

Gracias !

===========================================

Me estoy quedando sin tiempo y tengo que renunciar a usar namedQuery. Mi solución:

# UserDao.java 

  public User getUser(Long id, String usename) {
        String getUser = "select u from user u where u.id " + Dao.isNull(id) 
                       + " And u.username " + Dao.isNull(username);
        Query query = Dao.entityManager.createQuery(getUser);
    }

# Dao.java

   public static String isNull(Object field) {
        if (field != null) {
                if (field instanceof String) {
                    return " = " + "'" + field + "'";
                } else {
                    return " = " + field;
                }

            } else {
                return " is NULL ";
            }
    }

Respuestas a la pregunta(2)

Su respuesta a la pregunta