Parkeisenbahn, Luxembourg

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.

Die CSU und die Sperrklausel des Grauens

Wie funktioniert das eigentlich mit der CDU und CSU? Wie kann es sein, dass eine der beiden Parteien nicht auf dem Stimmzettel zu finden ist, sie dann aber doch gemeinsam im Koalitionsboot sitzen? Auch wenn man nicht immer diesen Eindruck hat: Es handelt sich tatsächlich um zwei eigenständige Parteien. Die CDU kann man allerdings nicht in Bayern wählen, die CSU nicht außerhalb.

Beide Parteien müssen (wie jede andere Partei in Deutschland auch) bei einer Bundestagswahl jeweils die fünf-Prozent-Hürde knacken, um in den Bundestag einziehen zu dürfen. Für die CSU haben dafür bisher alleine die Stimmen in Bayern ausgereicht, um die Partei deutschlandweit komfortabel über die 5% zu holen. Aber wie komfortabel ist die Stimmenzahl wirklich, oder anders gefragt: Wie schlecht müsste die CSU in Bayern abschneiden, um bundesweit an der Sperrklausel zu scheitern? Wagen wir also ein Gedankenexperiment und fragen uns, wie viele gültige Wählerstimmen bei der Bundestagswahl 2009 in Bayern notwendig gewesen wären, um die CSU bundesweit gerade noch auf die 5% kommen zu lassen.

Erst einmal die Fakten. In dem offiziellen Wahlergebnis heißt es, von bundesweit insgesamt 43.371.190 gültigen Wählerstimmen entfielen auf die CSU 2.830.238 Zweitstimmen, was 6,5% ausmacht. In Bayern selbst brachte es die Partei bei insgesamt 6.720.532 gültigen Wählerstimmen damit auf 42,5%.

Bei 43.371.190 gültigen Wählerstimmen bundesweit braucht eine Partei mindestens 2.168.560 Stimmen, um die fünf-Prozent-Hürde zu nehmen — was die CSU in Bayern alleine aufbringen müsste. Bei den dortigen 6.720.532 gültigen Wählerstimmen wären das mindestens 32,3%, die die CSU im eigenen Land erreichen müsste, um in den Bundestag ziehen zu können. Natürlich ist das keine statische Grenze. Sie hängt von der Zahl der gültigen Wählerstimmen bundesweit und in Bayern ab, und damit auch direkt von der Wahlbeteiligung.

Mit diesen Zahlen im Hinterkopf ist es gut zu verstehen, warum bei der CSU derzeit die Nerven blank liegen, nachdem eine unveröffentlichte Umfrage ergab, dass sie derzeit nur noch auf rund 38% der Stimmen käme. Wenn sich dieser Abwärtstrend fortsetzt, wird die nächste Bundestagswahl erstmalig eine Zitterpartie für die Christsozialen. Und damit auch für die CDU, denn scheitert die CSU an der fünf-Prozent-Hürde, fehlen der Union schlagartig ebendiese Prozentpunkte.

Die Schuld sieht die CSU in der mieserablen Koalitionsarbeit und darin, dass die große Schwester den rechten Flügel zu stark vernachlässigt. Sollte die Stimmenerosion so weitergehen, dürfte es die CSU zu einem drastischen Schritt zwingen, um sich zu retten: das Aufkündigen der Union und die Umorganisation in eine eigenständige, stärker rechtsorientierte und bundesweit wählbare Partei. Sie würde das Vakuum rechts der Union füllen und dürfte der CDU einige Stimmen kosten. Stehen wir also vor einer weiteren Zersplitterung einer ehemaligen Volkspartei, so wie es die SPD mit den Linken erfuhr?