как получить данные или запрос от многих ко многим? - PullRequest
0 голосов
/ 02 июля 2019

У меня есть сущности product и code, и я устанавливаю для них связь ManyToMany, поэтому это будет Product_Code

, поэтому Product_Code будет иметь product_id и product_id

. Я действительно хочу получить данные изпродукт по коду, но результат, который я хочу получить, я хочу получить информацию о значениях продукта и кодовых значениях, я не знаю, как это сделать на JPA

Я думал сначала получить код продукта,затем найдите идентификатор продукта в таблице Product_Code для этого идентификатора, а затем получите данные из него и снова найдите идентификатор кода для объекта кода, я уверен, что есть способ получить данные для этого, но я не знаю, как, иМне очень нравится, чтобы получить простой способ понять, как это работает

Я очень новичок здесь

мой продукт сущности что-то вроде этого

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

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

    @Column(name = "NAME", nullable = false)
    private String Name;

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

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

} 

и вот моя сущность кода:

@Entity
@Table(name = "CODE")
@DynamicUpdate
@Setter
@Getter
public class Voucher extends Base {

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

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

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

    private String descriptions;

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

Я действительно хочу получить все данные, когда я пытаюсь найти по коду, скажем, что я хочу найти продукт с кодом, подобным "A7", поэтому я хочу получить от сущности продуктаи затем я получу объект подробного кода также с product_id и code_id, подобным этому продукту

, когда я попытался Product findByCode(String code) или Product findOneByCode(String code), в результате получается объект Base, который я расширяю, а не объект Productобъект Base является объектом многократного использования, например, генерирует id, token, createdAt, deletedAt, updatedAt

1 Ответ

0 голосов
/ 02 июля 2019

Этого можно добиться с помощью Specification<Product> в репозитории с поддержкой JpaSpecificationExecutor<Product>.

  1. Убедитесь, что ваши ProductRepository орудия труда JpaSpecifiactionExecutor<Product>

затем, где-нибудь в вашем @Service с обоими VoucherRepository и ProductRepository инъекцией, сделайте:

//implement a method in VoucherRepository findByName which returns Voucher instance.
Voucher code = voucherRepository.findByName("A7");

//then pass the instance to isMember function in ProductRepository
List<Product> products = productRepository.findAll((r, q, b) -> b.isMember(code, Product_.codes));

Комментарии

r, q, b - параметры метода для лямбда-выражения, такие как реализация Specification<Product> переопределяющего метода toPredicate. Если ваш проект ограничивает вас использованием Java версии 7 и ниже, вы можете реализовать этот объект с помощью следующего:

Specification<Product> spec = new Specification<Product>() {
        @Override
        public Predicate toPredicate(Root<Product> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
            return criteriaBuilder.isMember(code, root.get(Product_.codes));
        }
};

Параметры

r обозначает корневой элемент Root<Product>

q обозначает запрос критерия CriteriaQuery<?>

b обозначает критерии построения CriteriaBuilder

Product_.* - статическая метамодель для вашей Product сущности. Он может быть сгенерирован автоматически с использованием генератора моделей JPA или создан вручную с помощью аннотации @Staticmetamodel.

Выполнив findAll(Specification<Product>), вы делаете выбор в стиле фильтрации, где ваш список результатов будет содержать только продукты, соответствующие вашим критериям.

Edit:

Ваша Product метамодель может выглядеть (пока), но, тем не менее, я рекомендую использовать генератор метамодели.

@StaticMetamodel(Product.class)
public class Product_ {
      public static volatile SetAttribute<Product, Code> codes;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...