Jet*_*Abe 19 java orm hibernate hql sql-order-by
嗨,任何人都可以指出我们如何将order by子句作为命名参数传递给hql
例如:
作品:
select tb from TransportBooking as tb
and TIMESTAMP(tb.bookingDate, tb.bookingTime) >= current_timestamp() order by tb.bookingDate
Run Code Online (Sandbox Code Playgroud)
不起作用:
select tb from TransportBooking as tb
and TIMESTAMP(tb.bookingDate, tb.bookingTime) >= current_timestamp() order by :order
Run Code Online (Sandbox Code Playgroud)
Pas*_*ent 26
不支持,输入参数仅允许在WHERE和HAVING子句中使用,并且不能使用该ORDER BY子句的参数.或者,如果我改写,您不能使用列的参数,只能使用值.那么,要么:
尝试存储不带order by子句的命名查询,获取查询字符串并在运行时添加order by子句.
Brian Fields在他的博客中解释了这一点:http: //brainfields.blogspot.com/2009/08/order-by-in-hibernate-named-queries.html
我已经为我的项目打包了这个想法:
private static final Pattern badQueryPattern = Pattern.compile("[^\\p{ASCII}]*");
public static String getNamedQueryString(EntityManager em, String queryName) throws SQLException {
Query tmpQuery = em.createNamedQuery(queryName);
SQLQuery sqlQuery = tmpQuery.unwrap(SQLQuery.class);
String queryString = sqlQuery.getQueryString();
if (badQueryPattern.matcher(queryString).matches()) {
throw new SQLException("Bad query string.");
}
return queryString;
}
public static Query getNamedQueryOrderedBy(EntityManager em, String queryName, Map<String, Boolean> columnNames) throws SQLException {
StringBuilder sb = new StringBuilder();
sb.append(ORDER_BY_CLAUSE_START);
int limit = columnNames.size();
int i = 0;
for (String columnName: columnNames.keySet()) {
sb.append(columnName);
if (columnNames.get(columnName))
sb.append(" ASC");
else
sb.append(" DESC");
if (i != (limit - 1)) {
sb.append(", \n");
}
}
Query jpaQuery = em.createNativeQuery( getNamedQueryString(em, queryName)
+ sb.toString()
);
return jpaQuery;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
40020 次 |
| 最近记录: |