Ожидаемый путь для присоединения к hql hibernate - PullRequest
1 голос
/ 02 июля 2019

Я знаю, что этот вопрос существует в SO.Однако я прочитал много сообщений в поисках этой ошибки, и я не могу решить свою проблему.

Я пытаюсь выполнить внутреннее объединение для отношений «многие ко многим», которые средняя таблица должна подчеркнуть, например, Promotion_code_product, но я пишу на @Query что-то вроде этого и не удалось, ошибка что-то вроде Path expected for join hql hibernate

вот мой запрос:

 @Query("SELECT p.serviceName, p.category, v.code from Product p " 
    + " INNER JOIN PromotionCodeCategory cp ON p.id = cp.productId " 
    + " INNER JOIN Voucher v on v.id = cp.promotionCodeId " 
    + " WHERE v.code = ?1")

Я также попробовал что-то вроде этого:

@Query("SELECT p.serviceName, p.category, v.code from Product p INNER JOIN PromotionCodeProduct cp ON p.id = cp.productId INNER JOIN Voucher v on v.id = cp.promotionCodeId WHERE v.code = ?1")

объект, подобный этому:

@Table(name = "VOUCHER")
@DynamicUpdate
//@Data
@Setter
@Getter
public class Voucher extends Base {

    @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    @JoinTable(name = "PROMOTION_CODE_PRODUCT",
               joinColumns =  @JoinColumn(name = "PROMOTION_CODE_ID"),
               inverseJoinColumns = @JoinColumn(name = "PRODUCT_ID"))
    private Set<Product> products;

    @Column(name = "CODE", unique = true)
    private String code;

    @Column(name = "TYPE", nullable = false)
    private String type;

    @Lob
    private String descriptions;

    public int hasCode() {
        return Objects.hashCode(getId());
    }

}



@Entity
@Table(name = "PRODUCT")
//@Data
@Setter
@Getter
@DynamicUpdate
public class Product extends Base {

    @ManyToMany(mappedBy = "products", fetch = FetchType.EAGER)
    private Set<Voucher> promotionCodes;

    @Column(name = "SERVICE_NAME", nullable = false)
    private String serviceName;

    @Column(name = "CATEGORY")
    private String category;

    @Column(name = "DESCRIPTION")
    private String description;

    public int hasCode() {
        return Objects.hashCode(getId());
    }

}

1 Ответ

1 голос
/ 02 июля 2019

Имейте в виду, что hql-соединения не совпадают с обычными sql-соединениями.

С hql вы выполняете запросы к сущностям вместо таблиц.

Таким образом, соединения выполняются для полей, содержащихся вentity.

Если ваш класс продукта содержит список или набор PromotionCodeCategory, называемый "категориями", а ваша PromotionCodeCategory содержит список или набор ваучеров, называемых "ваучерами", то ваш запрос должен выглядеть следующим образом:

@Query("SELECT p.serviceName, p.category, v.code from Product p " 
    + " INNER JOIN p.categories AS cp " 
    + " INNER JOIN cp.vouchers as v " 
    + " WHERE v.code = xxx")

Редактировать

Было отмечено, что существует только два объекта: продукт и ваучер.Следовательно, ваши классы должны выглядеть так:

@Entity
@Table(name = "products")
public class Product { 

    @ManyToMany(cascade = { CascadeType.ALL })
    @JoinTable(
        name = "product_voucher",   // insert join table name here
        joinColumns = { @JoinColumn(name = "product_id") }, // insert product column name from join table here 
        inverseJoinColumns = { @JoinColumn(name = "voucher_id") } // // insert voucher column name from join table here
    )
    Set<Voucher> vouchers = new HashSet<>();

    // standard constructor/getters/setters
}


@Entity
@Table(name = "vouchers")
public class Voucher {    

    @ManyToMany(mappedBy = "vouchers")
    private Set<Product> products = new HashSet<>();

    // standard constructors/getters/setters   
}

Тогда запрос на соединение должен выглядеть так:

@Query("SELECT p.serviceName, p.category, v.code from Product p " 
    + " INNER JOIN p.vouchers AS v " 
    + " WHERE v.code = xxx")

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...