2013-05-09 53 views
0

我有一个用例来显示使用完整实体中值的子集的实体列表。我采取的方法是创建一个只有这些字段出现在列表中的EntityList类。这个类映射到与完整实体相同的表,但只有一部分字段。加入HQL标准

使用HQL,我想过滤基于完整实体中的字段返回的EntityList。在下面的例子中,我想EntityList在Entity的描述字段(它在表中,但不在EntityList类中)过滤。

public interface IThreePhaseMotorList { 
abstract public Long getId(); 
abstract public String getMfg(); 
abstract public Double getPowerUnits(); 
abstract public Integer getPoles(); 
} 

public interface IThreePhaseMotor extends IMotor { 
public abstract Long getId(); 
public abstract void setId(Long id); 
public abstract Integer getVersion(); 
public abstract void setVersion(Integer version); 
public abstract String getIdsrc(); 
public abstract void setIdsrc(String idsrc); 
public abstract String getDescription(); 
public abstract void setDescription(String description); 
public abstract String getManufacturer(); 
public abstract void setManufacturer(String manufacturer); 
public abstract Integer getPoles(); 
public abstract setPoles(Integer poles); 
} 

如果我直接写SQL语句对表它看起来像:

Select IThreePhaseMotorList.* 
    from IThreePhaseMotorList JOIN IThreePhaseMotor ON 
     IThreePhaseMotorList.id = IThreePhaseMotor.id 
    where IThreePhaseMotor.Description like 'test%'; 

反正有没有做到这一点的HQL?

回答

1

我采取的方法是创建一个只有这些字段出现在列表中的EntityList类。这个类映射到与完整实体相同的表,但只有一部分字段。

这是问题的根源。不要这样做。只需使用完整的实体进行查询。加载一些不需要的列通常不会对性能产生任何重大影响。如果是这样,那么只需执行一个只选择你想要的列的查询。

+0

感谢您的建议。它确实会影响性能,因为结果集是通过Web服务发送的,并且必须编入/编出XML。我不想在SQL中编写查询,因为这需要大量维护列映射的代码,因此我的问题。 – 2013-05-09 14:05:37

+0

您不必强制从Web服务返回实体列表。您可以简单地将查询返回的每个实体实例转换为一个DTO对象,该对象只包含要编组并从Web服务返回的数据。我在哪里推荐SQL? HQL可用于返回属性,而不仅仅是实体:例如,从Foo foo加入foo.bar栏中选择foo.id,bar.name。参见http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#queryhql-select – 2013-05-09 14:12:50