Eclipselink NamedNativeQuery 将列名作为参数而不是值传递
Eclipselink NamedNativeQuery pass column name as parameter and not a value
尝试将列名作为参数传递,但 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();
问题是传递的列名被视为值,因此结果将return结果列表与"col_name"
的重复值而不是选择作为参数传递的列的值。
这是可以实现的吗?
基本上创建这样一个准备好的查询是没有意义的,无论如何你会如何命名该查询:“*”?所以简短的回答是:不。
但是如果符合您的要求,您可以动态创建命名查询:
String colName = "colName";
String query = "SELECT WHEN " + colName + " IS NULL THEN genre_default";
Query query = entitymanager.createQuery(query);
使用标准生成器可能更适合您使用 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();
尝试将列名作为参数传递,但 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();
问题是传递的列名被视为值,因此结果将return结果列表与"col_name"
的重复值而不是选择作为参数传递的列的值。
这是可以实现的吗?
基本上创建这样一个准备好的查询是没有意义的,无论如何你会如何命名该查询:“*”?所以简短的回答是:不。
但是如果符合您的要求,您可以动态创建命名查询:
String colName = "colName"; String query = "SELECT WHEN " + colName + " IS NULL THEN genre_default"; Query query = entitymanager.createQuery(query);
使用标准生成器可能更适合您使用 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();