2017-06-23 1 views
0

J'ai la déclaration suivante de elementCollectionElementCollection retour Null en réponse JSON

En classe MyMainClass

@Entity 
@Table(name = "MyMainClass") 
referencedColumnName="id")) 
@NamedQueries({ 
    @NamedQuery(
     name = "=findAll", 
     query = "SELECT s FROM MyMainClass s")}) 

public class MyMainClass implements Comparable<MyMainClass>, Serializable { 


     @JsonProperty 
     @ElementCollection(targetClass=String.class) 
     @Column 
     Map<String,String> myMap; 

public void setMyMap(Map<String,String> myMap) { 
this.myMap = myMap; 
} 

public Map<String,String> getMyMap() { 
return this.myMap; 
} 


} 

Cela crée une table MyMainClass_myMap

mymainclass_id mymapvalue mymapkey 


public List<MyMainClass> findAll(String param) { 
    Session session = sessionFactory.openSession(); 
    Transaction tx = null; 
    List<MyMainClass> myMainClass = null; 
    try { 
     tx = session.beginTransaction(); 
     String sql = "SELECT * FROM MyMainClass WHERE param = :param ; 
     SQLQuery query = session.createSQLQuery(sql); 
     query.setParameter("param", param); 
     query.addEntity(MyMainClass.class); 
     myMainClass = query.list(); 
     tx.commit(); 
    } 
    catch(RuntimeException e) { 
     if (tx != null) { 
     tx.rollback(); 
     } 
     throw e; 

    } 
    finally { 
     session.close(); 
    } 
    return myMainClass; 

    } 

Avec des valeurs NUT JSON renvoie null. pourquoi donc?

+0

Pourriez-vous fournir plus de contexte? Montrez-nous toute l'entité 'MyMainClass', le code qui récupère l'entité de JPA etc. Notez que les collections d'éléments sont récupérées par défaut par défaut – crizzis

+0

Puis-je changer le fetchType en désireux –

+0

Vous pouvez essayer, mais sans voir le code, je ne peux pas Je vous garantis que ça va aider – crizzis

Répondre

1

Vous avez défini une requête nommée pour récupérer toutes les instances de MyMainClass mais à l'intérieur de findAll, vous avez utilisé une requête SQL. Pourquoi donc? Votre requête SQL extrait uniquement les données de la table MyMainClass.

Ce que vous devez faire est de charger les entités en utilisant la requête obtenue à partir de session.getNamedQuery("=findAll"). Pour que les entités ont leur myMap peuplée, vous pouvez:

  1. Marquer la collection d'éléments comme avec impatience tirées par les cheveux à l'aide d'annotations JPA (@ElementCollection(fetch = FetchType.EAGER))
  2. Marquer la collection d'éléments avec autant d'empressement tiré par les cheveux à l'aide d'annotations Hibernate (@Fetch(FetchMode.JOIN))
  3. Utilisez une extraction se joindre à votre requête nommée (SELECT s FROM MyMainClass s LEFT JOIN FETCH s.myMap)
  4. Initialiser myMap avant de fermer la session (en appelant Hibernate.initialize(entity.getMyMap()) sur chaque entité extraite de la requête, par exemple)

Les options 2 et 3 seront probablement les plus performantes. Notez que les options # 1 et # 2 provoqueront myMap être récupérées avec impatience chaque fois que des instances de MyMainClass sont extraites du Session. Si c'est votre intention, ce serait probablement la solution.

+0

Merci beaucoup pour avoir expliqué cela. –