Eclipselink NamedNativeQuery передает имя столбца в качестве параметра, а не значение - PullRequest
1 голос
/ 27 марта 2019

Попытка передать имя столбца в качестве параметра, но JPA устанавливает его как значение, заключив его в одинарные кавычки.

@NamedNativeQueries({
    @NamedNativeQuery(
            name = "Genre.findAllLocalized",
            query = "SELECT "
                    + " CASE "
                    + "     WHEN ? IS NULL THEN genre_default"
                    + "     ELSE ? "
                    + " END localized_genre "
                    + "FROM genre ORDER BY localized_genre")
})

Тогда:

List<String> res = em.createNamedQuery("Genre.findAllLocalized")
                .setParameter(1, colName)
                .setParameter(2, colName)
                .getResultList();

Проблема в том, что переданные имена столбцов принимаются как значения , поэтому результат будет возвращать список результатов с повторяющимися значениями "col_name" вместо выбора значения столбца, переданного в качестве параметра.

Это достижимо?

1 Ответ

1 голос
/ 28 мая 2019

В принципе нет смысла создавать такой запрос, как бы вы его назвали: "*"? Итак, короткий ответ: нет.

  1. Но вы можете создавать именованные запросы динамически, если это соответствует вашему требованию:

    String colName = "colName";
    String query = "SELECT WHEN " + colName + " IS NULL THEN genre_default";
    Query query = entitymanager.createQuery(query);
    
  2. Возможно, использование построителя критериев - это больше, чем вы хотите использовать JPA (код из https://en.wikibooks.org/wiki/Java_Persistence/Criteria):

    // Select the employees and the mailing addresses that have the same address.
    CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
    CriteriaQuery criteriaQuery = criteriaBuilder.createQuery();
    Root employee = criteriaQuery.from(Employee.class);
    Root address = criteriaQuery.from(MailingAddress.class);
    criteriaQuery.multiselect(employee, address);
    
    criteriaQuery.where( criteriaBuilder.equal(employee.get("address"), address.get("address"));
    Query query = entityManager.createQuery(criteriaQuery);
    List<Object[]> result = query.getResultList();
    
...