Freshwater Crocodile

Dev

How to fetch a random entry with Hibernate

I recently found myself in the situation where I needed Hibernate to query a single, random entry from a table of Picture entities.

There is a simple way. Some DBMS allow to shuffle the result set by bringing the rows into a random order. For instance, in MySQL it is possible to use a query like this:

SELECT id FROM picture ORDER BY rand() LIMIT 1;

Since Hibernate delegates unknown function calls to the underlying DBMS, rand() could be used in a HQL query as well:

q.createQuery("FROM picture ORDER BY rand()").setMaxResults(1);

However this query would require MySQL, so we would sacrifice the benefit of Hibernate acting as an abstraction layer to the underlying database. HQL on the other hand does not offer a similar function.

A solution is to use the pagination technique. First we count the number of entries, and then select a random entry using setFirstResult(). With Hibernate Criteria, it would look something like this:

Criterion restriction = yourRestrictions;
Object result = null;  // will later contain a random entity
Criteria crit = session.createCriteria(Picture.class);
crit.add(restriction);
crit.setProjection(Projections.rowCount());
int count = ((Number) crit.uniqueResult()).intValue();
if (0 != count) {
  int index = new Random().nextInt(count);
  crit = session.createCriteria(Picture.class);
  crit.add(restriction);
  result = crit.setFirstResult(index).setMaxResults(1).uniqueResult();
}

restriction contains further restrictions to the result set (like only pictures that have been published). At the end, result contains a random single entry from the Picture entity, or null if the result set was empty.

Lenovo ThinkPad X100e und Fedora 13 - Teil 1

Mit dem ThinkPad X100e hat Lenovo ein ziemlich attraktives Netbook auf den Markt gebracht, nicht zuletzt wegen des Designs, der Ausstattung und des Preises. Doch wie steht es mit der Linux-Unterst√ľtzung? Und l√§sst sich die einzige wirkliche Schw√§che, der stromhungrige Prozessor, auch unter Linux ein wenig lindern?

In diesem ersten Teil beschreibe ich erst einmal die Hardware selbst. Der zweite Teil wird sich mit der Installation von Fedora 13 auf dem System beschäftigen, und im dritten Teil gebe ich dem System noch einen letzten Schliff, Stromsparmaßnahmen inklusive.

Aber schauen wir uns das ThinkPad erst einmal etwas näher an...

Continue reading...