2010-01-08 15 views
2

Je souhaite obtenir un résultat distinct basé sur une propriété, mais renvoyer l'identifiant dans la sélection car je l'utiliserai dans une sous-requête.Comment obtenir un résultat distinct, mais retourner une autre colonne dans le select?

par exemple.

(List<Article>) session.createQuery("from Article a where a.id in (select distinct a2.title from article a2 where a2.body = :body"); 
setString("body", "") 
.list(); 

La section clé est la sous-requête, Je veux retourner l'identifiant, pas la propriété a2.title. Est-ce que cela peut être fait?

(l'article du tableau a des doublons, donc je veux juste retourner l'un d'eux, peu importe le corps = "").

+1

Oh regarde, c'est M. 47%! –

+1

Sérieusement, ce mec me rend fou. – delfuego

+0

Hibernate me rend fou plus fou! – mrblah

Répondre

2

Si vous n'êtes pas attention quelle ligne est retournée, vous pouvez changer votre sous-requête à:

select MIN(a2.id) from article a2 where a2.body = :body 

Cela retournera le plus bas id de articlebody correspond.

+0

c'est MIN (a2.id) non? – mrblah

+0

@mrblah: Oui, 'MIN (a2.id)' –

2

quel serveur SQL est-ce? Au lieu d'utiliser distinct, vous pouvez demander une seule ligne pour revenir, et vous n'aurez plus qu'à sélectionner le (s) champ (s) dont vous avez réellement besoin.

Dans PL \ SQL (Oracle), vous pouvez utiliser rownum:

where rownum = 1 

Dans d'autres SQL, vous pouvez utiliser la limite:

Limit 1 

lecture: http://www.petefreitag.com/item/451.cfm

+0

sql server 2008 express – mrblah

+0

Essayez ensuite d'utiliser "LIMIT 1" dans votre requête interne. – rmn

+1

Dunno si "LIMIT" fonctionne dans tsql, mais "SELECT TOP 1 * FROM table" le fait. – wprl

Questions connexes