2013-03-12 2 views
1

J'ai une classe A qui a une autre classe B à l'intérieur. Quelque chose comme ceci:Optimiser une requête en hibernation avec des critères (éviter les jointures inutiles)

@Table(name = "A") 
Class A { 
    @OneToOne 
    @JoinColumn(name="B_ID") 
    B b; 
} 

Je veux avoir une requête comme ceci:

SELECT * from A where B_ID = 4 

Mais quand j'utilise Criteria pour atteindre mon objectif, il des jointures internes les deux tables. Comment puis-je avoir un SELECT comme je l'ai dit.


Si elle aide, j'ai mes critères comme celui-ci:

DetachedCriteria crit = DetachedCriteria(A.class, "a"); 
crit.createAlias("a.b", "b"); 
crit.add(Restrictions.eq("b.id", 4)); 
getHibernateTemplate().findByCriteria(crit); 

Répondre

2

Un à un les relations sont attendues avec extraites par défaut dans Hibernate - c'est pourquoi vous obtenez une jointure interne. Essayez ceci:

@OneToOne(fetch = FetchType.LAZY) 
@JoinColumn(name="B_ID") 
B b; 
+0

Donc vous dites que si je fais la relation 'LAZY', le problème sera résolu? –

+0

Je serais très surpris si cela ne résout pas le problème. Hibernate devrait être assez intelligent pour savoir que vous ne voulez pas charger l'objet B et que vous vous souciez uniquement de l'ID qui est stocké sur l'objet de support de la table A. – StuPointerException

+0

** Ceci n'est donc PAS LA RÉPONSE **. J'ai mis la relation à 'LAZY' mais, tant qu'il y a un' createAlias', il y a un 'inner-join'. –

Questions connexes