JPA Query: Wie checkt man, ob eine übergebene Liste von Werten leer ist?

Ich möchte sowas in der Art hier in einem JPA Repo machen:

@Query("SELECT q FROM QuestionEntity q WHERE" +
               "q.id IS IN :ids OR <<:ids ist leer>>")  
public List<QuestionEntity> findByIds(List<String> ids);

Also: Gib mir alle QuestionEntitys mit den gegebenen ids, oder wenn die ids-Liste leer ist, alle.

Aber trotz allem Gefrickel und Google Suche habe ich keine Lösung dafür gefunden. Kennt da jemand einen Trick?

Hi.
Ich habe es nicht ausprobiert.

Sowas wie: id in :ids xor size(:ids) = 0;

Dann könnte man natürlich beim aufrufen zwei Methoden im Repo angeben.

Oder man schreibt eine default Methode dir dann die fallunterscheidung macht.

Ich hatte ja gehofft, dass es sowas wie size, length. isEmpty oder so gibt, habe aber nichts gefunden.

Ich will Fallunterscheidungen vermeiden, weil es manchmal mehrere dieser Listen sind (Sprachen, Kategorien u.s.w.), und man dann natürlich eine kombinatorische Explosion hat.

Geht denn das nicht?

public List<QuestionEntity> find1(List<String> ids) {
	List<QuestionEntity> list = findByIds(ids);
	if (list.isEmpty()) {
		return findAll();
	}
	return list;
}

@Query("SELECT q FROM QuestionEntity q WHERE" +
               "q.id IS IN :ids OR <<:ids ist leer>>")  
public List<QuestionEntity> findByIds(List<String> ids);

@Query("query...")  
public List<QuestionEntity> findAll();

Ich verstehe noch nicht, wo du kombinatorisch-explodierenden Aufwand siehst.

Den explodierenden Aufwand habe ich, wenn ich neben der einen Liste noch weitere (mit der gleichen „zeige alles wenn leer“ Logik) in der gleichen Query habe. Also in etwa:

@Query("SELECT q FROM QuestionEntity q WHERE" +
               "(q.id IS IN :ids OR <<:ids ist leer>>) "+ 
               "AND (q.language IS IN :languages OR <<:langauges ist leer>>) " +
               "AND (q.type IS IN :types OR << :types ist leer >>)"
      )

Dann hast du schon mal acht verschiedene Methoden.

Und das mit dem size und XOR geht nicht?

@Landei lass dich nicht von Martin verwirren, der hat keine Ahnung.

Es sollte mit der Criteria API in JPA gehen - da explodiert da nicht Kombinatorik, weil du da das dann für jedes Attribut zwar machen musst - aber nur bei erzeugen des Kriteriums und unabhängig von andern