Eclipselink NamedNativeQuery将列名作为参数而不是值

时间:2019-03-27 13:50:49

标签: eclipselink jpa-2.1

试图将列名作为参数传递,但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 个答案:

答案 0 :(得分:1)

基本上,创建这样的预准备查询没有任何意义,无论如何您将如何命名该查询:“ *”?所以简短的答案是:不。

  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();