Здесь я пытаюсь выполнить запрос 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 дБ
Это вывод, который я получаю после вызова БД
Это в основном путающая цена товара с ценой товара
Объект 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. заранее спасибо.