IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

[EJB3UNIT] Exécution de requête SQL retourne null


Sujet :

JPA Java

  1. #1
    Membre confirmé Avatar de Lordsephiroth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Par défaut [EJB3UNIT] Exécution de requête SQL retourne null
    Bonjour,

    Je découvre EJB3Unit et je me retrouve face à un problème : je n'arrive pas à exécuter correctement de requête SQL correctement, j'obtiens immanquablement une valeur NULL en retour, bien que mon code soit d'une simplicité extrême...

    Ma question est donc la suivante : la librairie EJB3Unit permet-elle d'exécuter du SQL ? Elle simule en tout cas un EntityManager, permet de faire des persist() puis des find(). Dans ce cas, j'obtiens bel et bien un résultat.

    Par contre, dès que je tente d'appeler une fonction qui contient ce code, le résultat est toujours NULL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      public UserDTO findByLogin(String login) {
        Query q = entityManager.createQuery("SELECT u FROM UserEntity u WHERE u.userLogin=:login");
        q.setParameter("login", login);
        try{
          UserEntity userEntity = (UserEntity) q.getSingleResult();
          return DozerMappingHelper.getMapper().map(userEntity, UserDTO.class);
        }
        catch(NoResultException noResEx){
          return null;
        }
      }
    Le catch est toujours exécuté...

    Ma classe de test est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      /**
       * Test find user DTO by login
       */
      @Test
      public void testFindByLogin_existingLogin_expectValidDTO() {
        service = getBeanToTest();    
        Long id = service.create(getUserDTO());
        assertNotNull(id);
     
        UserDTO dto = (UserDTO)service.findByLogin("test");
        assertNotNull(dto);
        assertEquals(dto.getId(), id);
        assertEquals("test", dto.getLogin());
      }
    Enfin, la classe getUserDTO() contient le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      /**
       * Private method to create a user DTO
       * @return UserDTO 
       */
      private UserDTO getUserDTO()
      {
        UserDTO dto = new UserDTO();
        dto.setLogin("test");
        return dto;
      }
    La première assertion passe parfaitement, l'identifiant est bien retourné avec une valeur. La seconde assertion ne passe pas, le dto retourné est null (en debug je peux voir que c'est du à une NoResultException et pas à un problème avec le mapping Dozer).

    La requête SQL ne peut pourtant pas être fausse, cette fonction est appelée par l'application et fonctionne parfaitement...

    Merci d'avance de vos suggestions.


    Edit

    En mettant un point d'arrêt juste avant l'exécution de la query en mode debug, j'ai pu explorer l'objet entityManager. En explorant session -> persistenceContext -> entitiesByKey -> table, j'arrive à voir que l'entité que j'ai créée est bien enregistrée dans l'objet entityManager avec le texte "test" comme valeur du champ "login". L'objet se trouve donc bien en mémoire, mais j'ai l'impression que la requête SQL n'est pas exécutée.

    J'ai également testé une fonction différente (pour simplifier encore le code) sur laquelle j'ai le même problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      public List<UserEntity> findAll(){
        Query q = entityManager.createQuery("SELECT u FROM UserEntity u");
        List<UserEntity> users = q.getResultList();
        return users;
      }
    La liste est vide... comme si EJB3Unit n'arrivait pas à exécuter la requête correctement...

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try{
          UserEntity userEntity = (UserEntity) q.getSingleResult();
          return DozerMappingHelper.getMapper().map(userEntity, UserDTO.class);
        }
        catch(NoResultException noResEx){
          return null;
        }
    Peux tu enlever le try catch autour de ce bloc de code et reexecuter voir? On verra bien le type d'erreur qu'il renvoit.

  3. #3
    Membre confirmé Avatar de Lordsephiroth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Par défaut
    Bonjour,

    Voici la trace quand je mets en commentaire le try/catch :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    javax.persistence.NoResultException: No entity found for query
    	at org.ejb3unit.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:280)
    	at ch.goc.business.integration.UserIntegrationServiceBean.findByLogin(UserIntegrationServiceBean.java:106)
    	at ch.goc.business.integration.UserIntegrationServiceBeanTest.testFindByLogin_existingLogin_expectValidDTO(UserIntegrationServiceBeanTest.java:139)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:597)
    	at junit.framework.TestCase.runTest(TestCase.java:168)
    	at junit.framework.TestCase.runBare(TestCase.java:134)
    	at junit.framework.TestResult$1.protect(TestResult.java:110)
    	at junit.framework.TestResult.runProtected(TestResult.java:128)
    	at junit.framework.TestResult.run(TestResult.java:113)
    	at junit.framework.TestCase.run(TestCase.java:124)
    	at junit.framework.TestSuite.runTest(TestSuite.java:232)
    	at junit.framework.TestSuite.run(TestSuite.java:227)
    	at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
    	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
    	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    Eh ben là on avance, il te dit qu'il ne voit rien dans ta base. Peux tu nous faire voir le code de ton entité?

  5. #5
    Membre confirmé Avatar de Lordsephiroth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Par défaut
    Citation Envoyé par DevServlet Voir le message
    Eh ben là on avance, il te dit qu'il ne voit rien dans ta base. Peux tu nous faire voir le code de ton entité?
    Le code est 100% généré par Eclipse sur la base d'une DB Oracle. Une relation avec une autre table existe dans l'objet. A noter que je ne l'utilise pas dans mon test unitaire. Je me suis demandé d'ailleurs si la relation entre les deux objets UserEntity et ProfileParameterEntity pouvait être la source du problème. Malheureusement, après avoir mis en commentaire toute les lignes faisant référence à ProfileParameterEntity, j'ai toujours le même problème : entityManager.find() fonctionne parfaitement, un résultat null (ou une liste vide) m'est retournée dès qu'une requête SQL intervient dans la fonction testée...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    package ch.goc.business.integration.entity;
     
    import java.io.Serializable;
    import javax.persistence.*;
    import java.util.List;
     
     
    /**
     * The persistent class for the USER_USER database table.
     * 
     */
    @Entity
    @Table(name="USER_USER")
    public class UserEntity implements Serializable {
    	private static final long serialVersionUID = 1L;
     
    	@Id
    	@SequenceGenerator(name="USER_USER_USERPK_GENERATOR", sequenceName="SEQ_USER_USERID")
    	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="USER_USER_USERPK_GENERATOR")
    	@Column(name="USER_PK")
    	private long userPk;
     
    	@Column(name="USER_LOGIN")
    	private String userLogin;
     
    	//bi-directional many-to-one association to ProfileParameterEntity
    	@OneToMany(mappedBy="user")
    	private List<ProfileParameterEntity> userProfileParameters;
     
        public UserEntity() {
        }
     
    	public long getUserPk() {
    		return this.userPk;
    	}
     
    	public void setUserPk(long userPk) {
    		this.userPk = userPk;
    	}
     
    	public String getUserLogin() {
    		return this.userLogin;
    	}
     
    	public void setUserLogin(String userLogin) {
    		this.userLogin = userLogin;
    	}
     
    	public List<ProfileParameterEntity> getUserProfileParameters() {
    		return this.userProfileParameters;
    	}
     
    	public void setUserProfileParameters(List<ProfileParameterEntity> userProfileParameters) {
    		this.userProfileParameters = userProfileParameters;
    	}
     
    }

Discussions similaires

  1. [AJAX] Exécuter une requête SQL des la checkbox cochée
    Par dje064 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 31/05/2007, 11h25
  2. Réponses: 2
    Dernier message: 24/04/2007, 00h18
  3. [MySQL] Lenteur pour exécuter un requête SQL
    Par jean tof dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 10/01/2007, 13h59
  4. exécuter deux requêtes SQL à partir d'un bouton de commande
    Par Platon93 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/12/2006, 17h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo