spring—如何使用JavaHibernate和criteria获取表的特定列及其外键作为对象

wbgh16ku  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(321)

假设我在JavaSpring中使用hibernateMap了一个对象用户(具有多个属性),并且对象地址(也具有多个属性)位于 hbm.xml 用户文件与地址存在多对一关系。

public class User{
     Long id;
     String name;
     Integer age;
     Address address;
}

public class Address{
     Long id;
     String description;
     Integer number;
     String state;
     String country;
}

我想使用条件进行查询,其中我只想得到 id, name 仅限用户 id, description, number 地址。
我已经试过了 setProjection 但如果 id,name,address 在投影列表中,它将从address获取所有属性,但我只需要一些特定的性能问题。

Criteria criteria = createCriteria(User.class, "user");
criteria.setProjection(Projections.projectionList()
            .add(Projections.property("user.id"),"id")
            .add(Projections.property("user.name"),"name")                
            .add(Projections.property("user.address"),"address")
    ).setResultTransformer(Transformers.aliasToBean(User.class));

我使用的是较旧版本的hibernate,因此它使用xml文件Mapjava对象和数据库表:

<class name="com.models.impl.User" table="USER">
        <id name="id" column="USER_ID"></id>
        ...
        <many-to-one lazy="false" name="address" class="com.models.impl.Address" >
              <column name="ADDR_ID"/>
        </many-to-one>
    </class>

在这种情况下,通过用户id过滤地址(及其特定列)的第二个查询不是我的选项。这样我就必须打开与数据库的另一个连接,因为我有一个超过三千行的查询,所以两个查询的性能开销将非常高。
有人能帮我吗?
谢谢大家

e4eetjau

e4eetjau1#

你用的是哪个版本?您必须加入地址关联,才能只投影特定的字段/列,例如:

Criteria criteria = createCriteria(User.class, "user");
criteria.setProjection(Projections.projectionList()
        .add(Projections.property("user.id"),"id")
        .add(Projections.property("user.name"),"name")                
        .add(Projections.property("user.address.number"),"addressNumber")                
        .add(Projections.property("user.address.state"),"addressState")
).setResultTransformer(Transformers.aliasToBean(User.class));

我不知道遗留的hibernate criteria api的确切细节,但是我认为有了这些信息,您应该能够弄清楚:)

相关问题