【问题标题】:Jpa criteria api - create class that connect other classJpa criteria api - 创建连接其他类的类
【发布时间】:2020-12-23 06:11:45
【问题描述】:

假设我有以下 SQL:

select * from table1
inner join table2 on table1.id = table2.table1id;
inner join table3 on table2.id = table3.table2id;
inner join table4 on table3.id = table4.table3id;

我有 Java 实体,例如 table1、table2、table3 和 table4。

我想使用标准 API 映射此查询。为此,我创建了包含所有类的所有字段的类 Table5。

然后我用方法创建了一个仓库:

public List<Table5> getAllTable5 () {
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Table5> query = cb.createQuery(Table5.class);
    Root<Table1> root = query.from(Table1.class);

    Join<Table1, Table2> table1Table2Join= root.join(Table1_.TABLE2);
    Join<Table2, Table3> table2Table3Join= root.join(Table2_.TABLE3);
    Join<Table3, Table4> table3Table4Join= root.join(Table3_.TABLE4);

    query.multiselect(
           root.get // all fields
    );

    TypedQuery<Table5> typedQuery = em.createQuery(query);

    return typedQuery.getResultList();
} 

是否可以创建类:

class Table5 {
    private Table1 table1;
    private Table2 table2;
    private Table3 table3;
    private Table4 table4;
    
    // getters setters constructors
}

如果是,getAllTable5 方法应该是什么样子?

【问题讨论】:

    标签: java hibernate criteria-api


    【解决方案1】:

    您可以选择每个表实体,也可以只选择第一个并依赖连接获取。

    public List<Table5> getAllTable5 () {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Table1> query = cb.createQuery(Table1.class);
        Root<Table1> root = query.from(Table1.class);
    
        query.select(root);
    
        TypedQuery<Table1> typedQuery = em.createQuery(query);
        EntityGraph entityGraph = em.createEntityGraph();
        // Apply subgraphs for the associations to fetch
        typedQuery.setHint("javax.persistence.loadgraph", entityGraph);
        List<Table1> list = typedQuery.getResultList();
        List<Table5> table5s = new ArrayList<>(list.size());
        for (Table1 t : list) {
            table5s.add(new Table5(t, t.getTable2(), , t.getTable2().getTable3(), , t.getTable2().getTable3().getTable4());
        }
        return table5s;
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 2017-03-15
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 2022-12-21
      • 1970-01-01
      相关资源
      最近更新 更多