Соединение двух таблиц в репозитории JPA

Я собираюсь бросить учебник по весенней загрузке и получил это требование

    @Entity
    @Table(name = "transiction")
    public class Transictions {
        
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long Id;
        
        @Column(name = "userId")
        private Long userId;
        
        @Column(name = "productName")
        private String productName;
        
        @Column(name = "quantity")
        private int quantity;
        
        @Column(name = "price")
        private double price;
        
        @Column(name = "transictionDate")
        private Date transictionDate;
    
// Getter and Setter method with constructor.

Мой второй класс модели

@Entity
@Table(name = "product")
public class product {
    
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    
    @Column(name = "product")
    private String productName;
    
    @Column(name = "ltp")
    private float LTP;
    
    @Column(name = "exchange")
    private String exchange;

Таким же образом я создал другой контроллер и два разных репозитория JPA, чтобы получать данные из каждой таблицы и работать нормально.

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import com.springboot.Ole.Model.Transictions;

public interface TransictionRepository extends JpaRepository<Transictions, Long>{
    
    
}

Класс модели для продукта

package com.springboot.Ole.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.springboot.Ole.Model.Product;

@Repository
public interface ProducttRepository extends JpaRepository<Instrument, Long>{

}

Теперь у меня есть секанрио, где мне нужно соединить эти два стола.

Команда MySql

SELECT transiction.user_id, transiction.quantity,transiction.product_name, transiction.Price,product.LTP             
FROM product
INNER JOIN transiction
ON product.product=transiction.product_name;

Я вижу правильные данные в sql. Но я не знаю, как написать этот запрос в Java-коде.

Я собираюсь бросить этот учебник https://docs.spring.io/spring-data/jpa/docs/current/reference/ html / # projection, но не понимаю.

Это то, что я пытаюсь сделать в своем репозитории

package com.springboot.Ole.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import com.springboot.Ole.Model.Transictions;

public interface TransictionRepository extends JpaRepository<Transictions, Long>{
    
    @Query(value = "SELECT transiction.user_id, transiction.quantity,transiction.product_name, transiction.Price,product.LTP"
            + "FROM product"
            + "INNER JOIN transiction"
            + "ON product.product=transiction.product_name")
            
}

Но не повезло, потому что я не храню это в каком-то списке или, может быть, что-то еще не уверен.

У меня вопрос

  1. Надо ли писать класс обслуживания или что-то в этом роде.

Кто-нибудь может помочь мне здесь.

2
David 1 Июл 2021 в 17:48

3 ответа

Лучший ответ

Итак, вы запрашиваете собственные запросы, поэтому вам нужно передать nativeQuery = true в аргумент запроса. Также вам необходимо добавить аннотацию @Repository в интерфейс TransictionRepository . Это не что иное, как слой Дао.

package com.overflow.overflow.service;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import com.overflow.overflow.models.Transictions;

@Repository
public interface TransictionRepository extends JpaRepository<Transictions, Long> {
    @Query(nativeQuery = true,
            value = "SELECT transiction.user_id, transiction.quantity,transiction.instrument_name, transiction.Price,instrument.LTP"
            + "FROM instrument"
            + "INNER JOIN transiction"
            + "ON instrument.instrument=transiction.instrument_name")
    public List<Object[]> getTransictionsAndInstruments();
}

1
ASHUTOSH GUPTA 1 Июл 2021 в 18:32

Чтобы расширить комментарий Mr_Thorynque, если существует отношение FK между двумя объектами, вы можете определить это в самих объектах.

Вот пример.

@Entity
    @Table(name = "transiction")
    public class Transiction {
        
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long Id;
        
        @Column(name = "userId")
        private Long userId;
        
        @Column(name = "productName")
        private String productName;
        
        @Column(name = "quantity")
        private int quantity;
        
        @Column(name = "price")
        private double price;
        
        @Column(name = "transictionDate")
        private Date transictionDate;

        @ManyToOne(fetch = FetchType.EAGER)
        @JoinColumn(name = "product_id")
        private Product product;
    
...
}

@Entity
@Table(name = "product")
public class product {
    
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    
    @Column(name = "product")
    private String productName;
    
    @Column(name = "ltp")
    private float LTP;
    
    @Column(name = "exchange")
    private String exchange;

    @OneToMany(mappedBy = "product", fetch = FetchType.LAZY)
    private List<Transiction> transictions

...
}

Здесь я делаю некоторые предположения.

  • с продуктом связано несколько переходов
  • с трансляцией связан один продукт
  • существует строгая взаимосвязь PK / FK между трансляцией и продуктом

В любом случае, учитывая вышеизложенное, если вы получите Transiction, он вернет Transiction с заполненным сопутствующим объектом Product.

Кстати, если вам нравится этот ответ, пожалуйста, также проголосуйте за комментарий Mr_Thorynque.

1
Clayton Long 1 Июл 2021 в 18:02

Если вы хотите использовать объединение таблиц в spring jpa, вам необходимо использовать модели отношений, которые предлагает Spring, а именно хорошо известные «один к одному», «один ко многим» и «многие ко многим». В связях остатка данных пружины объясняются различные типы соединений, которые можно использовать в ваш проект.

Например, если вам нужна связь один-к-одному, ваш код будет следующим:

@Entity
@Table(name = "transiction")
public class Transictions {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long Id;
    
    @Column(name = "userId")
    private Long userId;
    
    @OneToOne(mappedBy = "transiction")
    private Product product;
    
    @Column(name = "quantity")
    private int quantity;
    
    @Column(name = "price")
    private double price;
    
    @Column(name = "transictionDate")
    private Date transictionDate;
    
@Entity
@Table(name = "product")
public class Product {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    
    @Column(name = "product")
    private String productName;
    
    @Column(name = "ltp")
    private float LTP;
    
    @Column(name = "exchange")
    private String exchange;
    
    @OneToOne
    @JoinColumn(name = "transiction_id")
    @RestResource(path = "product-transiction", rel="transiction")
    private Transictions transiction;
1
Ricardo Fraga 1 Июл 2021 в 18:58