Поиск объекта по другому объекту в качестве критерия - PullRequest
0 голосов
/ 01 декабря 2018

У меня простые отношения между сущностями:

class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String name;
    private double calories;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn
    private Category category;
}

class Category {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(unique = true)
    private String name;

    Category(String name) {
        this.name = name;
    }
}

И я использую следующий репозиторий

interface ProductRepository extends Repository<Product, Long> {
    Product save(Product product);
    Page<Product> findAll(Pageable pageable);
    Page<Product> findByCategory(Pageable pageable, Category category);
    void delete(Product product);
}

Который вызывается в facade, как это

 public Page<ProductDTO> getProductsByCategory(Pageable pageable, String categoryName) {
        return productRepository.findByCategory(pageable, dtoConverter.toCategory(categoryName))
                .map(Product::toDTO);
    }

и dtoConverter

Category toCategory(String categoryName) {
        return new Category(categoryName);
    }

Что в итоге приводит нас к Controller

@GetMapping("/findCategory")
    Page<ProductDTO> getProductsByCategory(Pageable pageable, @RequestParam String categoryName) {
        return productFacade.getProductsByCategory(pageable, categoryName);
    }

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

{
    "timestamp": "2018-11-30T22:57:29.660+0000",
    "status": 404,
    "error": "Not Found",
    "message": "No message available",
    "path": "/products/findCategory=fruit"
}

Даже если я уверен, что есть продукты этой категории, хранящиеся в БД (я считаю, что они смотрят прямов MySQL и с помощью конечной точки findAll).Кто-нибудь может объяснить мне, что здесь не так?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Поскольку имя вашей категории уникально, вы можете изменить метод репозитория на

interface ProductRepository extends Repository<Product, Long> {
    Product save(Product product);
    Page<Product> findAll(Pageable pageable);
    Page<Product> findByCategory_Name(Pageable pageable, String categoryName);
    void delete(Product product);
}

и использовать его в своем методе getProductsByCategory

public Page<ProductDTO> getProductsByCategory(Pageable pageable, String categoryName) 
{
    return productRepository.findByCategory_Name(pageable, categoryName))
            .map(Product::toDTO);
}
0 голосов
/ 01 декабря 2018

У вас проблема в следующем фрагменте.

Category toCategory(String categoryName) {
    return new Category(categoryName);
}

Вы не можете просто создать новый объект.Вам необходимо вернуть объект, который имеет ссылку на таблицу базы данных.Поэтому сначала вам нужно извлечь объект категории из базы данных, а затем вернуть его.

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

public interface CategoryRepository extends Repository<Category,Long> {
    Category findByName(String name);
}

А затем в вашем методе:

Category toCategory(String categoryName) {
    return categoryRepository.findByName(categoryName);
}

Примечание: вы можете расширить JpaRepository вместо Repository, что даст несколько удобных методов.

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