#spring #hibernate #jpa
Вопрос:
привет, я использую hibernate 5.4.32. у меня есть две сущности JPA, которые не имеют никакой связи между ними . Есть ли какой-либо способ, которым я могу получить результаты в своей сущности.
Сущность 1
@Entity
@Table(name = "XYZ_EC")
public class LoanOrder{
@Id
UUID id;
public List<DDLTable> ddlTables; // select TABLE_NAME, DESCRIPTION, FILTER_TYPE from DDLTable where TABLE_NAME = 'ABC', this is the query i want to be executed .
//LoanOrder Entity does not have any column to map to DDL entity.
Сущность 2
@Table(name = "DDL_TABLE")
@Entity
public class DDLTable implements Serializable {
@Id
@Column(name = "TABLE_NAME")
private String tableName;
@Id
@Column(name = "DESCRIPTION")
private String description;
@Id
@Column(name = "FILTER_TYPE")
private String filterType;
}
Комментарии:
1. Вы можете использовать
PostConstruct
вLoadOrder
сущности и извлекать и устанавливать любые данные, которые вам нужны.
Ответ №1:
Вы могли бы попробовать использовать @JoinFormula
@OneToMany
@JoinFormula("TABLE_NAME = 'ABC'")
public List<DDLTable> ddlTables;
Пожалуйста, найдите более подробную информацию в документации:
https://docs.jboss.org/hibernate/orm/5.5/userguide/html_single/Hibernate_User_Guide.html#associations-JoinFormula
Ответ №2:
Хотя это не очень правильно и чисто то, чего вы пытаетесь достичь (было бы лучше использовать третий класс, a DTO
для хранения всех данных, которые вы хотите получить от обеих сущностей), вы можете попробовать следующее:
В LoanOrder
Entity отметьте ddlTables
список как временный, чтобы JPA проигнорировал его и не пытался сопоставить это поле со столбцом базы данных.
@Transient
public List<DDLTable> ddlTables;
Тогда, предположительно, у вас где @Service
-то есть класс, который занимается запросами к базе данных и т. Д.
@Service
public class LoanOrderService {
@Autowired
EntityManager em;
public LoanOrder loadSomething() {
List<DDLTable> ddlTables = em.createQuery("SELECT ddl FROM DDLTable ddl WHERE ddl.tableName = 'ABC'", DDLTable.class).getResultList();
//load a `LoanOrder` object from database similarly and set its ddlTables list to the one loaded above.
LoanOrder loanOrder = ....; // load from database or create new depends on what you want to do
loanOrder.setDdlTables(ddlTables);
return loanOrder;
}
}