Неправильное преобразование таблицы JPA в сущность - PullRequest
0 голосов
/ 10 марта 2020

Здесь я пытаюсь выполнить запрос sql, используя пружинный JPA и получить в ответ entites, а затем преобразовать объекты в структуру yy.

Проблема в том, что две таблицы и entites имеют В том же столбце JPA не может различить значения этих свойств и отображает неправильные значения в сущности, вот мой код:

DAO

public class EMIDao implements IEMIDao {

    @Autowired
    private EntityManager entityManager;

    @Override
    public List<EMI> fetch(Integer month) {
        Query query = entityManager.createNativeQuery(
                "SELECT DISTINCT e.*, p.*, l.*, i.* FROM emi e JOIN loan l ON l.loan_id = e.loan_id LEFT JOIN product p ON p.product_id = l.product_id LEFT JOIN item i ON i.product_id = p.product_id LEFT JOIN item_return ir ON ir.item_id = i.item_id WHERE e.date = ?1 AND ir.item_return_id IS NULL",
                "EMIProductDTO");
        query.setParameter(1, "2020-" + month + "-16");
        List<Object[]> objects = query.getResultList();

        return EMITransformer.transform(objects);
    }

}

Трансформатор

public class EMITransformer {

    public static List<EMI> transform(List<Object[]> objects) {
        Map<Integer, EMI> emiMap = new HashMap<>();
        Map<Integer, Product> productMap = new HashMap<>();
        Map<Integer, Loan> loanMap = new HashMap<>();
        Map<Integer, Item> itemMap = new HashMap<>();
        if (CollectionUtils.isNotEmpty(objects))
            for (Object[] objectArray : objects) {
                if (ArrayUtils.isNotEmpty(objectArray)) {
                    EMI emi = (EMI) objectArray[0];
                    if (!emiMap.containsKey(emi.getId()))
                        emiMap.put(emi.getId(), emi);

                    Product product = (Product) objectArray[1];
                    if (product != null && !productMap.containsKey(product.getId())) {
                        product.setItems(new HashSet<>(0));
                        productMap.put(product.getId(), product);
                    }

                    Loan loan = (Loan) objectArray[2];
                    if (loan != null && !loanMap.containsKey(loan.getId()))
                        loanMap.put(loan.getId(), loan);

                    Item item = (Item) objectArray[3];
                    if (item != null && !itemMap.containsKey(item.getId()))
                        itemMap.put(item.getId(), item);
                }
            }
        itemMap.forEach((id, item) -> {
            productMap.get(item.getProductId()).getItems().add(item);
        });
        loanMap.forEach((id, loan) -> {
            loan.setProduct(productMap.get(loan.getProductId()));
        });
        emiMap.forEach((id, emi) -> {
            emi.setLoan(loanMap.get(emi.getLoanId()));
        });
        return new ArrayList<>(emiMap.values());
    }
}

Это данные, которые у меня есть в моих mysql дБ

This is the data I have in my db

Это вывод, который я получаю после вызова БД

enter image description here

Это в основном путающая цена товара с ценой товара

Объект EMI:

@Entity
@Table(name = "emi")
@SqlResultSetMapping(name = "EMIProductDTO", entities = { 
        @EntityResult(entityClass = EMI.class),
        @EntityResult(entityClass = Product.class), 
        @EntityResult(entityClass = Loan.class), 
        @EntityResult(entityClass = Item.class) 
})
public class EMI {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "emi_id")
    private Integer id;
    @Column(name = "loan_id")
    private Integer loanId;
    @Column(name = "principal")
    private Integer principal;
    @Column(name = "interest")
    private Integer interest;
    @Column(name = "date")
    private Date date;
    @Column(name = "created_on")
    private Timestamp createdOn;
    @Transient
    private Integer emi;
    @Transient
    private Loan loan;

Объект продукта

@Entity
@Table(name = "product")
@SqlResultSetMapping(name = "ProductItemDTO", entities = { @EntityResult(entityClass = Product.class),
        @EntityResult(entityClass = Item.class) })
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "product_id")
    private Integer id;
    @Column(name = "order_number")
    private String orderNumber;
    @Column(name = "product_type")
    private String type;
    @Column(name = "price")
    private Integer price;
    @Column(name = "created_on")
    private Timestamp createdOn;

Элемент объекта

@Entity
@Table(name = "item")
public class Item {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "item_id")
    private Integer id;
    @Column(name = "type")
    private String type;
    @Column(name = "brand")
    private String brand;
    @Column(name = "price")
    private Integer price;
    @Column(name = "product_id")
    private Integer productId;
    @Column(name = "created_on")
    private Timestamp createdOn;

Все работает, как и ожидалось, я не могу изменить подход к использованию аннотаций onetoonemapping, просто хочу, чтобы jpa правильно отображал поля цен, любая помощь очень полезна eciated. заранее спасибо.

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