代码之家  ›  专栏  ›  技术社区  ›  Renaud is Not Bill Gates

如何在具有枚举字段的实体上使用JPA标准查询填充DTO类字符串字段?

  •  2
  • Renaud is Not Bill Gates  · 技术社区  · 7 年前

    这是我的问题:

    final CriteriaQuery<MyClassDTO> query = builder.createQuery(MyClassDTO.class);
    

    在里面 MyClassDTO 我有以下4个字段:

    private String icon;
    private String provenance;
    private int sizeX;
    private int sizeY;
    

    我从中检索数据的路径是:

    final Root<MyClass> from = query.from(MyClass.class);
    

    MyClass 有3个字段:

    @Column
    @Enumerated(EnumType.STRING)
    private EnumTileIcon enumTileIcon;
    
    @Column
    @Enumerated(EnumType.STRING)
    private EnumProvenance enumProvenance;
    
    @Column
    @Enumerated(EnumType.STRING)
    private EnumSize enumSize;
    

    我想做的是填充 MyClassDTO 使用 query.multiselect ,如下所示:

    query.multiselect(
        from.get(MyClass_.enumTileIcon.toString()),
        from.get(MyClass_.enumProvenance.name()),
        from.get(MyClass_.enumSize.getWidth()),
        from.get(MyClass_.enumSize.getHeight())
    );
    

    我如何解决这个问题?

    1 回复  |  直到 7 年前
        1
  •  11
  •   pirho    7 年前

    我不确定多选的作用。但是在处理 投影 这似乎是你可以使用的 CriteriaBuilder.construct()

    创建构造函数以 MyClassDTO like(如果需要,添加参数)

    public MyClassDTO(EnumTileIcon icon, EnumProvenance provenance) {
        this.icon=icon.toString();
        this.provenance=provenance.toString();
    }
    

    在查询like中调用构造函数(如果需要,添加get参数以匹配构造函数参数)

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<MyClassDTO> cq = cb.createQuery(MyClassDTO.class);
    Root<MyClass> root = cq.from(MyClass.class);
    cq.select(cb.construct(MyClassDTO.class,
                 root.get("enumTileIcon"), root.get("enumProvenance")));
    

    然后你就可以

    TypedQuery<MyClassDTO> tq = em.createQuery(cq);