Продолжение вкладов Брандона Бертельсена в Rcpp. Для меня версия NumericVector не работала: она заменила только первое NA. Это связано с тем, что вектор ina
оценивается только один раз в начале функции.
Вместо этого можно использовать тот же подход, что и для функции IntegerVector. Для меня работали следующие:
library(Rcpp)
cppFunction('NumericVector na_locf_numeric(NumericVector x) {
R_xlen_t n = x.size();
for(R_xlen_t i = 0; i<n; i++) {
if(i > 0 && !R_finite(x[i]) && R_finite(x[i-1])) {
x[i] = x[i-1];
}
}
return x;
}')
Если вам нужна версия CharacterVector, то работает тот же базовый подход:
cppFunction('CharacterVector na_locf_character(CharacterVector x) {
R_xlen_t n = x.size();
for(R_xlen_t i = 0; i<n; i++) {
if(i > 0 && x[i] == NA_STRING && x[i-1] != NA_STRING) {
x[i] = x[i-1];
}
}
return x;
}')
Это было опубликовано на форуме Hibernate несколько лет назад, когда его спросили о том, почему это сработало в Hibernate 2, но не в Hibernate 3:
Предел был never поддерживаемое предложение в HQL. Вы должны использовать setMaxResults ().
blockquote>Так что если он работал в Hibernate 2, кажется, это было по совпадению, а не по дизайну. Я думаю, что это было потому, что парсер Hibernate 2 HQL заменил бит запроса, который он распознал как HQL, и оставил все остальное как есть, чтобы вы могли прокрасться в какой-то собственный SQL. Hibernate 3, однако, имеет правильный алгоритм AST HQL, и он намного менее прощает.
Я думаю, что
Query.setMaxResults()
действительно является вашим единственным вариантом.
// SQL: SELECT * FROM table LIMIT start, maxRows;
Query q = session.createQuery("FROM table");
q.setFirstResult(start);
q.setMaxResults(maxRows);
setFirstResult
, тогда как здесь и в другом месте они просто говорят setMaxResults
this и setMaxResults
, что без упоминания о том, как установить смещение.
– demongolem
1 August 2014 в 21:27
Если вы не хотите использовать setMaxResults()
в объекте Query
, вы всегда можете вернуться к использованию обычного SQL.
Если вы можете управлять лимитом в этом режиме
public List<ExampleModel> listExampleModel() {
return listExampleModel(null, null);
}
public List<ExampleModel> listExampleModel(Integer first, Integer count) {
Query tmp = getSession().createQuery("from ExampleModel");
if (first != null)
tmp.setFirstResult(first);
if (count != null)
tmp.setMaxResults(count);
return (List<ExampleModel>)tmp.list();
}
Это действительно простой код для обработки лимита или списка.
String hql = "select userName from AccountInfo order by points desc 5";
Это работало для меня без использования setmaxResults();
Просто укажите максимальное значение в последнем (в данном случае 5) без использования ключевого слова limit
, : Р [/ д2]
Criteria criteria=curdSession.createCriteria(DTOCLASS.class).addOrder(Order.desc("feild_name"));
criteria.setMaxResults(3);
List<DTOCLASS> users = (List<DTOCLASS>) criteria.list();
for (DTOCLASS user : users) {
System.out.println(user.getStart());
}
Если вы не хотите использовать setMaxResults, вы также можете использовать Query.scroll вместо списка и извлекать нужные строки. Полезно для подкачки, например.
setMaxResults()
загружает первую каждую запись в память, а затем создает подсписку, которая, когда сто тысяч или более записей сбрасывает сервер, потому что у него не хватает памяти. Тем не менее я мог перейти от запрошенного JPA запроса к запросу Hibernate через QueryImpl hibernateQuery = query.unwrap(QueryImpl.class)
, а затем я мог бы использовать метод scroll()
, как вы предложили.
– toongeorges
21 June 2017 в 14:59
Вам нужно написать собственный запрос, this .
@Query(value =
"SELECT * FROM user_metric UM WHERE UM.user_id = :userId AND UM.metric_id = :metricId LIMIT :limit", nativeQuery = true)
List<UserMetricValue> findTopNByUserIdAndMetricId(
@Param("userId") String userId, @Param("metricId") Long metricId,
@Param("limit") int limit);
Мое замечание состоит в том, что даже у вас есть ограничение в HQL (hibernate 3.x), это либо приведет к ошибке синтаксического анализа, либо просто игнорируется. (если у вас есть заказ от + desc / asc до предела, он будет проигнорирован, если у вас нет desc / asc до предела, это вызовет ошибку синтаксического анализа)
setMaxResults
, который будет принимать ограниченное количество строк результатов из набора результатов и отображать его пользователю, в моем случае у меня есть 3 миллиона записей, которые запрашиваются, а затем я вызываю setMaxResults установить 50 записей, но я не хочу этого делать, а сам запрос я хочу запросить 50 записей, есть ли способ сделать это? – Rachel 27 January 2012 в 22:06setMaxResults
hibernate добавит частьlimit
к запросу. Он не получит всех результатов. Вы можете проверить полученный запрос, включив:<property name="show_sql">true</property>
– Andrejs 23 December 2014 в 10:55