2010-05-24 5 views
1

select x from X x where x.a.id = :a_id -> Toujours 0 objets sélectionnésJava: JPQL instruction select

Pourquoi la déclaration de JPQL ci-dessus fonctionne pas, mais celui ci-dessous le travail?

select a from A a where a.id = :a_id -> a_obj
select x from X x where x.a = :a_obj -> Toujours correct nombre d'objets sélectionnés

Ni requête renvoie une exception pendant l'exécution, mais on obtient un certain nombre de résultats différents.

Merci


Mise à jour

J'ai essayé les requêtes suivantes en utilisant Jointures:
select x from X x, x.a a where x.a.id = :a_id -> TopLink exception pour jeton inattendu

et ceci: select x from X x JOIN x.a a where a.id = :a_id - > Toujours corriger le nombre d'objets sélectionnés

Avec la dernière requête, j'ai résolu le problème initial. Cependant, maintenant j'ai deux requêtes qui devraient fonctionner, mais pour une raison quelconque ne le font pas.

select x from X x where x.a.id = :a_id -> Toujours 0 objets sélectionnés
select x from X x, x.a a where x.a.id = :a_id -> TopLink exception pour jeton inattendu

Quelqu'un at-il un comportement similaire rencontré d'autre?

+0

quel fournisseur JPA utilisez-vous? – mdma

+0

@mdma: TopLink/Java DB, sur Glassfish 2.1.1 – bguiz

Répondre

0

Je pense que vous devez également introduire l'entité a dans le premier exemple afin que ses attributs soient visibles.

Quelque chose comme

select x from X x join fetch x.a where x.a.id = :a_id 

(je n'utilise JPA, je tiens à HQL, c'est donc non testé, non prouvée et vient sans une garantie de remboursement.)

+0

Vous n'êtes pas obligé de le faire. –

+0

@Pascal - D'accord.Je ne m'attendais pas non plus à ce que ce soit nécessaire, sachant Hibernate. Je pousse juste pour un autre point de données pour voir si nous pouvons obtenir TopLink pour livrer ce qui est attendu. – mdma

+0

:% s/ne devrait pas/ne devrait pas/g –

1

Avec l'entité suivante pour X

@Entity 
public class EntityX { 

    @Id @GeneratedValue 
    private Long id; 

    @OneToOne 
    private EntityA a; 

    // ... 
} 

Et celui-ci A:

@Entity 
public class EntityA { 
    @Id @GeneratedValue 
    private Long id; 

    //... 
} 

La requête JPQL suivante:

from EntityX x where x.a.id = :id 

l'instruction SQL suivante Génère:

select 
    entityx0_.id as id282_, 
    entityx0_.a_id as a2_282_ 
from 
    EntityX entityx0_ 
where 
    entityx0_.a_id=? 

Il fonctionne simplement et retourne autant de résultats que prévu.

Testé avec Hibernate (et EclipseLink). Si ce n'est pas représentatif de votre cas, veuillez ajouter plus de détails.

+0

Merci pour la réponse, vous avez en effet compris ma question correctement, cependant, je suis perplexe par le résultat différent que je reçois. Pourriez-vous s'il vous plaît me pointer dans la direction de la façon de voir ce que SQL est généré, comme ce que vous avez fait? (J'utilise Toplink/Java DB sur Glassfish 2.1.1, avec NetBeans IDE, si cela fait une différence) – bguiz

+0

Je n'utilise pas TopLink mais je pense que la propriété 'toplink.logging.level.sql' devrait faire le tour. Jetez un coup d'œil à [TopLink JPA Extensions for Logging] (http://www.oracle.com/technology/products/ias/toplink/JPA/essentials/toplink-jpa-extensions.html#TopLinkLogging) pour plus de détails. –