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

Der Artikel ist von 2010 und bezieht sich auf die Bundestagswahl von 2009. Die grundsätzliche Problematik gilt natürlich generell, auch wenn die konkreten Zahlen von der jeweiligen Wahlbeteiligung abhängen. Interessant ist übrigens, dass der Artikel eine Partei rechts von der Union bereits damals vorhergesagt hat.

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 aus Bayern ausgereicht, um die Partei deutschlandweit komfortabel über die 5% zu heben.

Aber wie komfortabel ist diese Stimmenzahl wirklich, oder anders gefragt: Wie schlecht müsste die CSU in Bayern abschneiden, um gerade noch in den Bundestag einziehen zu können? Wagen wir also ein Gedankenexperiment und fragen uns, wie viele gültige Wählerstimmen bei der Bundestagswahl 2009 in Bayern mindestens notwendig gewesen wären.

Erst einmal die Fakten. In dem offiziellen Wahlergebnis heißt es, bundesweit entfielen auf die CSU 2.830.238 Zweitstimmen. Bei 6.720.532 gültigen Wählerstimmen in Bayern kam die CSU damit auf komfortable 42,5%. Bei einer Bundestagswahl müssen die Zahlen allerdings deutschlandweit betrachtet werden. Bei 43.371.190 gültigen Wählerstimmen in ganz Deutschland entfielen damit tatsächlich nur 6,5% der Stimmen auf die CSU.

Um bei 43.371.190 gültigen Wählerstimmen die fünf-Prozent-Hürde zu nehmen, benötigt eine Partei mindestens 2.168.560 Stimmen. Die CSU muss diese alleine in Bayern aufbringen. Bei den dortigen 6.720.532 gültigen Wählerstimmen sind das mindestens 32,3%, die die CSU im eigenen Land mindestens erreichen musste, 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.

Je mehr Wähler bundesweit überhaupt eine gültige Stimme abgeben, desto mehr Wähler muss die CSU im eigenen Land aufbringen, um es über diese Hürde zu schaffen.

Mit diesen Zahlen im Hinterkopf ist es gut zu verstehen, warum bei der CSU im August 2010 die Nerven blank lagen, 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 gesamten 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ässige. Sollte die Stimmenerosion so weitergehen, könnte 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?