2016-10-06 1 views
2

Je dois faire une jointure en hibernation, mais je veux exclure certains résultats d'être trouvé. Je l'ai essayé d'utiliser @JoinColumnsOrFormulas, mais je reçois encore tous les résultatsHibernate oneToOne rejoindre avec des critères supplémentaires

@OneToOne 
@JoinColumnsOrFormulas({ 
     @JoinColumnOrFormula(formula = @JoinFormula(value= "(select a.seller_sku from de_products a where a.asin = 'a' and a.product_name != '' and a.seller_sku != '' and a.seller_sku = sku)", referencedColumnName = "seller_sku")), 
     @JoinColumnOrFormula(column = @JoinColumn(name = "sku", referencedColumnName = "seller_sku", insertable = false, updatable = false)) 
}) 
public DeProducts getDeProduct() { 
    return deProduct; 
} 

Si j'essaie sans la column définition

@OneToOne 
@JoinColumnsOrFormulas({ 
     @JoinColumnOrFormula(formula = @JoinFormula(value= "(select a.seller_sku from de_products a where a.asin = 'a' and a.product_name != '' and a.seller_sku != '' and a.seller_sku = sku)", referencedColumnName = "seller_sku")) 
}) 
public DeProducts getDeProduct() { 
    return deProduct; 
} 

je reçois un NullPointerException au démarrage de l'application, à

org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory

Comment faire une jointure avec spring-boot (1.4) hibernate (5.2.2.Final) avec des critères/exclusions supplémentaires?

Répondre

0

Je pense avoir trouvé une solution qui fonctionne. Hibernate semble ignorer le @JoinForumula en référençant la même colonne dans la formule et dans l'annotation @JoinColumn. Lorsque vous faites référence à une autre colonne de la formule - par ex. id, ça marche.

@OneToOne 
@JoinColumnsOrFormulas({ 
     @JoinColumnOrFormula(formula = @JoinFormula(value = "(select a.id from de_products a where a.asin != '' and a.product_name = 'a' and a.seller_sku = sku)", 
       referencedColumnName = "id")), 
     @JoinColumnOrFormula(column = @JoinColumn(name = "sku", referencedColumnName = "seller_sku", insertable = false, updatable = false)) 
}) 
public DeProducts getDeProduct() { 
    return deProduct; 
}