如何在不加入子类的情况下使用Hibernate标准

时间:2016-01-25 17:18:32

标签: java mysql hibernate join

我正在尝试使用Hibernate标准而不加入子类。这是我的情况:

Notification.hbm.xml具有以下关系:

<many-to-one name="myObject" class="MyObject" column="MY_OBJECT_UID" not-null="true" index="NOTIFICATIONS_OBJECT" foreign-key="NOTIFICATIONS_OBJECT"/>

我的JAVA代码:

1. Criteria criteria = session.createCriteria(Notification.class.getName());
2. criteria.createAlias("myObject", "myObject", CriteriaSpecification.LEFT_JOIN);
3. criteria.addOrder(Order.desc("myObject.name").ignoreCase());
4. List<Notification> res = (List<Notification>) criteria.list();

如果我删除第2行和第3行,我得到的结果没有加入MyObject,但是如果我添加它们,那么查询就很庞大并且正在与所有MyObject子类进行连接(并且有很多)。

我需要一个解决方案来避免那些Hibernate连接。 MyObject的一个连接是可以的(尽管没有必要),但加入它的每个子类都很糟糕。 我有什么选择? 谢谢。

1 个答案:

答案 0 :(得分:1)

一种解决方案是使用投影,仅查询您需要的字段

ProjectionList properties = Projections.projectionList();
properties.add(Projections.property("property1").as( "property1"));
...
criteria.setProjection(properties);

criteria.setResultTransformer(new AliasToBeanResultTransformer(Notification.class));

您可以将它映射到您的域对象,但最好将它映射到自定义DTO,如NotificationDTO,因为它不是托管实体,而是简单的pojo:

您将无法更新/删除它。但如果您需要“只读”模式下的数据,那么这是最佳解决方案。