2010-11-23 2 views
1

modèle Ma DB est la suivante:Filtre CayenneDataObject getXXXArray() entrées avec paramètres?

A.id (1 : n) B.ad_id 

Ainsi, dans le poivre de Cayenne pour objet A a je peux faire a.getBArray() qui me retourne toutes les entrées de B de cette donnée Une entrée. Pourtant, je voudrais filtrer sur cette liste, basée sur la propriété active = 1.

Évidemment, je peux utiliser Expression.fromString("active = 1") avec SelectQuery, mais pour cette approche, je ne peux pas trouver comment j'associe l'instance A sous laquelle je veux exécuter cette requête.

Une approche différente est de récupérer toutes les entrées de a.getBArray() et de filtrer dans le code en recherchant uniquement celles qui ont active == true, cette approche est IMHO inefficace.

Les recommandations sont les plus appréciées.

Merci, Maxim.

- EDIT:

Ma solution actuelle à est (les noms d'objets ont été remplacés par un & b respectivement):

long aId = DataObjectUtils.longPKForObject(db_a_instance); 
String bSQL = "select * from b where active = 1 and a_id = " + aId; 
SQLTemplate bQuery = new SQLTemplate(B.class, bSQL); 
List<B> dbBs = context.performQuery(bQuery); 

et je me demande s'il y a une meilleure, plus elegent Solution?

Merci.

Répondre

2

J'ai posé une question similaire sur la liste de diffusion amicale de Cayenne. Vous pouvez see here.

Il semble que l'approche préférée consiste à passer par une relation et un filtre en Java, sauf si la relation renvoie des données très volumineuses. L'avantage de faire en sorte que la liste complète sera en mémoire et la prochaine fois que vous utilisez la relation, vous n'avez pas besoin de faire un voyage à DB.

La réponse est ici cité

Les deux nécessitent un voyage à la DB.

  1. (le déplacement dans l'approche de la relation) exige un voyage une fois la DB à reprocher aux groupes de la DB, mais il y aura en mémoire. (La requête avec approche par filtre) nécessite un déclenchement à chaque fois dans la base de données, ce qui peut être plus lent à long terme, même si elle renvoie moins de correspondances.

Si cela est quelque chose qui se produit qu'une seule fois et que vous êtes vraiment préoccupés par la performance (et peut-être ont beaucoup de groupes), je aller aveC# 2, sinon # 1. Vous pouvez également optimiser # 1 un peu, donc vous n'avez pas à parcourir chaque fois pour vérifier.

via: Michael Gentry

Questions connexes