Как сопоставить несвязанную сущность JPA

#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;
    }
}