Использование объединения с псевдонимом в спецификации данных Spring - PullRequest
0 голосов
/ 12 апреля 2020

У меня

Manufacturer {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "manufacturer_id")
    private int id;

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

    @OneToMany(mappedBy = "manufacturerEntity", fetch = FetchType.LAZY)
    private Set<Product> productSet;
}
Product {   
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "product_id")
    private int id;

    @Column(name = "price")
    private Double price;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "manufacturer_id")
    private Manufacturer manufacturerEntity;
}

Это необработанный запрос

SELECT
    *
FROM
    product INNER JOIN manufacturer 
    ON product.manufacturer_id = manufacturer.manufacturer_id
WHERE
    manufacturer.manufacturer_id = 1
(or product.manufacturer_id = 1)

Как переписать этот запрос в спецификации, я не знаю, как получить Id, потому что у меня 2 Id ( то же имя, как вы можете видеть выше), и я не использую типобезопасный объект, как (Product_). Мне нужно что-то вроде псевдонима для этого запроса

SELECT
    *
FROM
    product as p
    INNER JOIN manufacturer as m ON p.manufacturer_id = m.manufacturer_id
WHERE
    m.manufacturer_id = 1
(or p.manufacturer_id = 1)

Это моя спецификация

public static Specification<Product> hasManufacturer(int manufacturerId) {
        return (root, query, builder) -> {
            Join<Product, Manufacturer> joinProdManu = root.join("manufacturerEntity");

            return builder.equal(joinProdManu.get("id"), manufacturerId);
        };
    }
...