Как обрабатывать нулевое значение числового типа в именованном запросе JPA
Я хочу передать два параметра в namedquery. Один тип числа, а другой тип строки. Они оба могут быть нулевыми.
Например, (id = null, username = 'joe') и (id = 1, username = 'joe') два разных результата. В namedQuery синтаксис «u.id равен нулю», если id равен нулю, и «u.id =: id», если идентификатор не равен нулю. Мой вопрос заключается в том, как динамически обрабатывать идентификатор, хранящийся в namedQuery?
Пожалуйста, проверьте мой пример кода:
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;
}
UserDao.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;
}
}
=======================================
Что я пробовал:
Это устаревший код, и я не хочу менять структуру. Поэтому я не хочу использовать критерии.
выберите u из User u, где (: id равен нулю или u.id =: id) и u.username =: username
// выбросить исключение: несовместимые типы данных: ожидается, что NUMBER получил BINARY
выберите u из User u, где u.id = nullif (: id, null) и u.username =: username
// Исключение: несовместимые типы данных: ожидается, что NUMBER получил BINARY
Я также попробовал nvl и декодировать в namedQuery, не сработало.
query.setParameter ("id", id == null? -1: id) // не работает.
Мой последний выбор будет писать запрос в файле UserDao, чтобы заменить namedQuery в файле пользователя.
Спасибо !
===========================================
У меня заканчивается время и я должен отказаться от использования namedQuery. Мое решение:
# 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 ";
}
}