【问题标题】:JPQL - projecting @Embeddable object in queryJPQL - 在查询中投影@Embeddable 对象
【发布时间】:2019-11-04 03:39:49
【问题描述】:

假设我的域类有这个:

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 或类似的东西自动完成?

【问题讨论】:

    标签: java hibernate jpql dto mapstruct


    【解决方案1】:

    只需创建一个带有可嵌入键参数的构造函数,就像这样:

    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");
    

    【讨论】:

    • 这更像是一种解决方法...在实际代码中可能会有带有 50 个参数的构造函数。
    • 您可以使用 lombok 及其酷炫的功能,例如 @AllArgsConstructor@Builder
    【解决方案2】:

    您可以使用 MapStruct 将 A 映射到 ADto (猜想ADto 中有错字,您的意思是包含EmbeddedDto 而不是Embedded。)

    只需定义一个映射器

    @Mapper
    public interface SomeMapper {
    
         SomeMapper INSTANCE = Mappers.getMapper(SomeMapper.class);
    
         ADto map(A in);
    } 
    

    Mapstruct 还会自动生成EmbeddedEmbeddedDto 的方法

    不确定这在 JPQL 中是否可行(我在这里不熟悉,但从您的示例中您可以调用 java),但您可以尝试:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      • 2019-12-02
      相关资源
      最近更新 更多