代码之家  ›  专栏  ›  技术社区  ›  Steve Claridge

从多个表中读取并使用jpa sqlresultsetmapping填充多个实体

  •  2
  • Steve Claridge  · 技术社区  · 15 年前

    我一直在使用JPA构建一个JSF应用程序来访问数据库。有许多实体。

    我想创建一个搜索结果屏幕,显示表中多个实体的列。这些实体没有外键关系。

    为了实现这一点,我使用了EntityManager.CreateNativeQuery并指定了EntityMapping,如下所示:

     Query q = em.createNativeQuery(
         "select t.id as id1, t.bb as bb1, t.cc as cc1," +
         "t2.id as id2, t2.aa as aa2, t2.bb as bb2 " +
         " from table1 t, table2 t2 where t.cc = '22' and t2.id = 2", "TestMapping");
    
     result = q.getResultList();
    

    测试映射如下:

     @SqlResultSetMapping(name =
     "TestMapping", entities = {
         @EntityResult(entityClass = Table1.class, fields = {
             @FieldResult(name = "id", column = "id1"),
             @FieldResult(name = "bb", column = "bb1"),
             @FieldResult(name = "cc", column = "cc1")}
             ),
         @EntityResult(entityClass = Table2.class, fields = {
             @FieldResult(name = "id", column = "id2"),
             @FieldResult(name = "aa", column = "aa2"),
             @FieldResult(name = "bb", column = "bb2")}
             )
         } )
    

    如果我指定的话,这个就可以了 查询中两个实体的所有列名 这在这个小例子中很好,但是搜索结果必须从4个实体中选择,所有实体都有大量的列。如果不指定EntityMapping中的所有列,则在对GetResultList()的调用中会引发异常。

    我的问题是:是否可以只指定查询中选定的EntityMapping中的列,而不必指定实体中的所有列?

    2 回复  |  直到 11 年前
        1
  •  0
  •   Tea Curran    14 年前

    我不知道这是否适用于所有JPA实现。如果使用Hibernate,则可以将所有属性映射为Lazy Fetch类型:

    @Basic(fetch = FetchType.LAZY)
    Date dateCreated;
    
    @Column(length=100)
    @Basic(fetch = FetchType.LAZY)
    String name;
    

    然后您需要检测您的类,否则它将忽略懒惰的属性:

    <target name="instrument" depends="compile">
    <taskdef name="instrument" classname="org.hibernate.tool.instrument.InstrumentTask">
        <classpath path="${jar.path}"/>
        <classpath path="${classes.dir}"/>
        <classpath refid="lib.class.path"/>
    </taskdef>
    
    <instrument verbose="true">
        <fileset dir="${testclasses.dir}/org/hibernate/auction/model">
            <include name="*.class"/>
        </fileset>
    </instrument>
    

        2
  •  0
  •   tinesoft    12 年前

    或者也可以使用语法 实体* 一次指定“实体”的所有列:

    Query q = em.createNativeQuery("select t.*, t2.*" + " from table1 t, table2 t2"+
                                   "where t.cc = '22' and t2.id = 2", "TestMapping");
    

    和测试映射:

    @SqlResultSetMapping(name = "TestMapping", 
    entities = { @EntityResult(entityClass =Table1.class), 
                 @EntityResult(entityClass =Table2.class)})
    
    推荐文章