Как обрабатывать нулевое значение числового типа в именованном запросе 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.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;
    }
}

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

Что я пробовал:

Это устаревший код, и я не хочу менять структуру. Поэтому я не хочу использовать критерии.

выберите 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 ";
            }
    }

Ответы на вопрос(2)

Ваш ответ на вопрос