Гибернация OneToOne join с дополнительными критериями

#java #mysql #spring #hibernate

#java #mysql #весна #гибернация

Вопрос:

Мне нужно выполнить объединение в гибернации, но я хочу исключить некоторые результаты из поиска. Я пробовал использовать @JoinColumnsOrFormulas , но все равно получаю все результаты

 @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;
}
  

Если я попробую это без column определения

 @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;
}
  

Я получаю исключение NullPointerException при запуске приложения, в

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

Как мне выполнить соединение с spring-boot (1.4) hibernate (5.2.2.Final) с дополнительными критериями / исключениями?

Ответ №1:

Я думаю, что нашел решение, которое работает. Похоже, что Hibernate игнорирует @JoinForumula при ссылке на один и тот же столбец в формуле и в аннотации @JoinColumn . При ссылке на другой столбец в формуле — например id , это работает.

 @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;
}