2010-04-01 6 views
5

J'ai une table avec 11 colonnes, mais je n'ai besoin que de 2 colonnes dans mon application, j'utilise la combinaison spring/hibernate/DAO. Pour l'instant j'ai une classe de domaine qui inclut tous les 11 champs, et un fichier de mappage qui mappe toutes les 11 colonnes dans la table. Comment est-ce que j'utilise obtenir seulement 2 d'entre eux pas tous?Obtenir moins de colonnes avec hibernation

Répondre

10

Soit:

  1. Utilisez des projections - Pro: rien à ajouter - Con: Non Typesafe (le résultat est une List de lignes où chaque ligne est un Object[]):

    select f.foo, f.bar from FatEntity f 
    
  2. Utilisation une expression constructeur dans la clause SELECT (la classe spécifiée n'est pas requise pour être une entité ou pour être mappée à la base de données) - Pro: solution typeafe - Con: Plus de classes, sauf si vous réutilisez FatEntity comme détenteur, auquel cas de nombreux domaines seront null:

    select new com.acme.FatEntityDetails(f.id, f.foo, f.bar) from FatEntity f 
    

    Notez que si une clause dans la SELECT NEW, les instances de l'entité résultant nom de la classe d'entité est spécifiée sont dans le nouvel état (pas d'identité persistante).

  3. Utilisez une autre entité mappée sur la même table avec uniquement les champs requis - Pro: C'est une entité réelle que vous pouvez modifier et mettre à jour - Con: Plus de classes.

    from LightEntity 
    

Les principales différences entre # 2 et # 3 sont:

  • 2 ne nécessite pas le titulaire d'être une entité du tout.

  • le détenteur dans # 2 pourrait être une entité mappée sur une autre table.
  • si # 2 renvoie des entités, elles sont dans un nouvel état (cela peut être un problème ou non).
+0

@Pascal Thivent ne puis-je pas laisser 2 champs dans ma classe de domaine et mon fichier de mapping? –

+0

@Gandalf Eh bien, je pensais que quelqu'un utilisait les autres champs. Si ce n'est pas vrai, vous pouvez en effet changer votre entité actuelle. –

+0

Merci pour les solutions multiples, et les explications, comment en arrivez-vous de toute façon? expirience? lire des livres, s'entraîner? Je vais accepter votre réponse.Si vous pouviez me diriger vers la bonne direction, ce serait formidable, comme: sites Web, exemples, livres. –

6

Essayez:

SELECT myEntity.one, myEntity.two FROM MyEntity myEntity 

Vous pouvez même faire:

SELECT new MyEntityDescription(myEntity.one, myEntity.two) FROM MyEntity myEntity 

pour obtenir une liste des descriptions des entités.

2

Si vous n'avez jamais besoin de plus que ces 2 colonnes de la table, vous pouvez modifier votre mappage d'hibernation pour mapper uniquement les 2 colonnes nécessaires à la classe d'entité. Ne mappez que les colonnes de table auxquelles vous souhaitez accéder dans votre application. Gardez à l'esprit que les contraintes de base de données sur les colonnes "ignorées" peuvent être violées comme des contraintes non nulles, des clés étrangères ou des contraintes uniques.

+0

qu'en est-il de la classe de domaine dois-je aussi avoir 2 champs? –