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.javapublic 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 ";
}
}