2013-05-09 4 views
0

J'ai un cas d'utilisation pour afficher une liste d'entités en utilisant un sous-ensemble de valeurs dans l'entité complète. L'approche que j'ai prise est de créer une classe EntityList avec seulement ces champs à apparaître dans la liste. Cette classe est mappée à la même table que l'entité complète, mais avec seulement un sous-ensemble de champs. En utilisant HQL, je veux filtrer l'EntityList renvoyé en fonction des champs qui sont dans l'Entité complète. Dans l'exemple ci-dessous, je souhaite que EntityList soit filtré sur le champ de description Entity (qui se trouve dans la table mais pas dans la classe EntityList).HQL Critère avec jointure

public interface IThreePhaseMotorList { 
abstract public Long getId(); 
abstract public String getMfg(); 
abstract public Double getPowerUnits(); 
abstract public Integer getPoles(); 
} 

public interface IThreePhaseMotor extends IMotor { 
public abstract Long getId(); 
public abstract void setId(Long id); 
public abstract Integer getVersion(); 
public abstract void setVersion(Integer version); 
public abstract String getIdsrc(); 
public abstract void setIdsrc(String idsrc); 
public abstract String getDescription(); 
public abstract void setDescription(String description); 
public abstract String getManufacturer(); 
public abstract void setManufacturer(String manufacturer); 
public abstract Integer getPoles(); 
public abstract setPoles(Integer poles); 
} 

Si j'écrivais SQL directement sur les tables, il ressemblerait à ceci:

Select IThreePhaseMotorList.* 
    from IThreePhaseMotorList JOIN IThreePhaseMotor ON 
     IThreePhaseMotorList.id = IThreePhaseMotor.id 
    where IThreePhaseMotor.Description like 'test%'; 

Y at-il de toute façon de le faire dans HQL?

Répondre

1

L'approche que j'ai prise est de créer une classe EntityList avec seulement ces champs à apparaître dans la liste. Cette classe est mappée à la même table que l'entité complète, mais avec seulement un sous-ensemble de champs.

Ceci est la racine du problème. Ne fais pas ça. Utilisez simplement l'entité complète pour votre requête. Le chargement de certaines colonnes inutiles n'a généralement pas d'impact significatif sur les performances. Et si c'est le cas, exécutez simplement une requête qui sélectionne uniquement les colonnes que vous voulez.

+0

merci pour la suggestion. Il a un impact sur les performances car l'ensemble de résultats est envoyé via un service Web et doit être converti en XML. Je préférerais ne pas écrire une requête en SQL car cela nécessiterait une maintenance importante du code pour la cartographie des colonnes d'où ma question. –

+0

Vous n'êtes pas obligé de renvoyer une liste de votre entité à partir du service Web. Vous pouvez simplement transformer chaque instance d'entité renvoyée par la requête en un objet DTO contenant uniquement les données que vous souhaitez rassembler et renvoyer depuis le service Web. Et où ai-je suggéré SQL? HQL peut être utilisé pour retourner des propriétés, pas seulement des entités: 'select foo.id, bar.name de Foo foo rejoindre foo.bar bar' par exemple. Voir http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#queryhql-select –

Questions connexes