JPQL - проектирование объекта @Embeddable в запросе - PullRequest
0 голосов
/ 21 июня 2019

Допустим, у меня есть это для классов моего домена:

class A{
  private Integer id;
  private Embded e;
}

@Embeddable
class Embded{
  private String emb;
}

и это для моих классов DTO:

class ADto{
  private Integer id;
  private Embded e;
}

class EmbdedDto{
  private String emb;
}

возможно ли запросить внутренний Embded объект как проекцию EmbdedDto? Примерно так:

@Query("SELECT new namespace.ADto(a.id, new namespace.EmbdedDto(a.e.emb)) FROM A a");

Можно ли сделать это автоматически, используя MapStruct или что-то подобное?

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Просто создайте конструктор с встраиваемыми ключевыми параметрами, вот так:

class ADto{
    private Integer id;
    private EmbdedDto e;

    public ADto(Integer id, String emb) {
        this.id = id;
        this.e = new EmbdedDto(emb);
    }
}

@Embeddable
class EmbdedDto{
    private String emb;

    public EmbdedDto(String emb) {
        this.emb = emb;
    }
}

Теперь вы можете:

@Query("SELECT new namespace.ADto(a.id, a.e.emb) FROM A a");
0 голосов
/ 22 июня 2019

Вы можете использовать MapStruct для сопоставления A с ADto (предположите, что в ADto есть опечатка, и вы намеревались включить EmbeddedDto вместо Embedded.)

Просто определите маппер

@Mapper
public interface SomeMapper {

     SomeMapper INSTANCE = Mappers.getMapper(SomeMapper.class);

     ADto map(A in);
} 

Mapstruct также автоматически сгенерирует метод для Embedded до EmbeddedDto

Не уверен, возможно ли это в JPQL (я здесь не знаком, но из вашего примера вы можете вызвать java), но вы можете попробовать:

@Query("SELECT SomeMapper.INSTANCE.map(a) FROM A a");
...