Jpa проекция не установить значение - PullRequest
0 голосов
/ 21 января 2020

У меня есть две таблицы, которые не связаны напрямую с внешним ключом.

@Entity
@Getter
@Setter
@NoArgsConstructor
@IdClass(CodeTablePK.class)
public class Codetable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "codetable_Sequence")
    @SequenceGenerator(name = "codetable_Sequence", sequenceName = "CODETABLE_SEQ", allocationSize = 1)
    private Integer codeId;

    @Id
    private String codeType;

    private Long labelId;

}

@Entity
@Getter
@Setter
@NoArgsConstructor
@IdClass(LabelPK.class)
public class Label extends BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "label_Sequence")
    @SequenceGenerator(name = "label_Sequence", sequenceName = "LABEL_SEQ", allocationSize = 1)
    private Long labelId;

    @Id
    private String labelLanguage;

    private String labelText;

}

@Getter
@Setter
@AllArgsConstructor
@EqualsAndHashCode
public class LabelPK implements Serializable {

    private Long labelId;
    private String labelLanguage;

}

Я создал запрос, чтобы связать обе таблицы по их labelId. Проекция не отображается

@Repository
public interface CodetableRepository extends JpaRepository<Codetable, Long> {

    @Query(value = "select  c.codeId, l.labelId, l.labelLanguage, l.labelText  from  Codetable c inner join Label l on c.labelId=l.labelId where c.codeType=:codeType")
    public List<CodetablePayload> findByCodeType(@Param("codeType") String codeType);

}

public interface CodetablePayload {

    Integer getCodeId();
    Long getLabelId();
    String getLabelLanguage();
    String getLabelText();

}

Выполненный запрос в порядке

select
        codetable0_.code_id as col_0_0_,
        label1_.label_id as col_1_0_,
        label1_.label_language as col_2_0_,
        label1_.label_text as col_3_0_ 
    from
        codetable codetable0_ 
    inner join
        label label1_ 
            on (
                codetable0_.label_id=label1_.label_id
            ) 
    where
        codetable0_.code_type=?

В sql, которые возвращают мне две строки.

Jpa возвращает мне два объекта с нулевым значением .

Почему сопоставление не сделано

1 Ответ

0 голосов
/ 22 января 2020

Попробуйте это с DTO - Проекция на основе классов . Я знаю, что проекции на основе интерфейса хорошо работают с нативными запросами. Я не знаю, как они работают с JPQL, тем более что имена столбцов были переведены в col_0_0_ и т. Д.

DTO-проекции также имеют то преимущество, что вы получаете ошибку, если не удается найти правильный конструктор. У вас также есть возможность отладить конструктор. И вы можете внутри конструктора создавать другие объекты.

...