通过映射表使用@ManyToMany 映射实体设置投影

时间:2021-06-19 11:14:59

标签: java hibernate jpa criteria

我正在尝试使用自定义投影,同时通过 Hibernate Criteria API 获取映射实体的对象。

课程

@Entity
public class Table1 {
    @ManyToMany(fetch=FetchType.LAZY)
    @JoinTable(name = "Table2")
    @MapKey(name = "key")
    @Cascade({CascadeType.PERSIST, CascadeType.MERGE})
    private Set<Table3> table3Entities;

    @Column(name = "nvalue")
    private String nval;

    @Column(name = "nvalue2")
    private String nval2;
    ...
}

@Entity
public class Table3 {
    @Column(name = "tkey")
    private String key;

    @Column(name = "tvalue")
    private String value;

    
} 

这里我只需要获取 nval 和 table3Entities 元素的所有字段。所以我在 DAO 类中尝试了这个:

   criteria = createCriteria();
   criteria.createAlias("table3Entities","table3Entities"); // Assuming creating an alias would automatically add all fields of table3Entities to the projections

   return criteria.setProjection(/* Add projection for nval property */).setResultTransformer(Transformers.aliasToBean(Table1.class)).list();

但是,这不会在返回的列表元素中返回任何 table3Entities 属性。

当我单独添加 table3Entities 的所有属性时,它部分工作正常 - 至少获取了必需的字段,但结果转换失败。

   // Working
   criteria = createCriteria();
   criteria.createAlias("table3Entities","table3Entities").setProjection(/* Add projection for all table3Entities properties one by one */);

   return criteria.setProjection(/* Add projection for nval property */).setResultTransformer(Transformers.aliasToBean(Table1.class)).list();

问题

  1. 为什么第一种方式(直接为映射实体添加别名)默认不获取映射实体的所有字段?
  2. 是否有比单独添加更好的方法将 Table3 的所有字段添加到投影中? (使用反射将是第二个选择,但也欢迎与此相关的答案)
  3. 有没有办法转换@ManyToMany 嵌套实体?

0 个答案:

没有答案
相关问题