1

我们有一个映射到休眠实体的数据库表。到目前为止一切顺利...

然而,我们想要的是仅映射满足特定标准的实体,例如' distinct(fieldA,fieldB) '...

是否可以使用休眠和休眠注释进行映射?我们该怎么做?使用@Filter?

4

4 回答 4

1

我建议您使用@Where注释。此注释可用于集合的元素实体或目标实体。您提供一个用 sql 编写的子句属性,该属性将应用于 hibernate 在该实体上执行的任何选择。它非常易于使用且非常易读。

这是一个例子。

@Entity
//I am only interested in Donuts that have NOT been eaten
@Where(clause = "EATEN_YN = 'N'")
public class Donut {

  @Column(name = "FILLING")
  private String filling;

  @Column(name = "GLAZED")
  private boolean glazed = true;

  @Column(name = "EATEN_YN")
  private boolean eaten = false;

...

}
于 2009-11-04T20:49:02.913 回答
0
  1. 您可以创建一个视图,然后将该视图映射到实体:

    create view my_data as
    select ... from ...
    
    @Entity(table="my_data")
    public class MyData { ... }
    
  2. 一种选择是正常映射表,然后您可以通过查询或过滤器获取始终的实体。

  3. 您还可以进行本机 SQL 查询并将实体映射到结果上:

    Query q = sess.createSQLQuery("SELECT DISTINCT fieldA, fieldB FROM some_table")
              .addEntity(MyEntity.class);
    List<MyEntity> cats = q.list();
    
  4. 也可以将 DISTINCT 添加到这种类型的HQL 查询中:

    select new Family(mother, mate, offspr)
    from DomesticCat as mother
    join mother.mate as mate
    left join mother.kittens as offspr
    

方法 1、3 和 4 将进行只读映射。

您能否更具体地说明您使用的标准?视图方法更通用,因为您无法使用休眠查询或过滤器完成所有操作。

于 2009-11-02T17:58:56.143 回答
0

也许您可以创建一个新的 Pojo 来封装字段和它们应该统计的条件。然后将该类设为“自定义用户定义类型”,这样 Hibernate 将不得不使用您提供的映射类来映射该“类型”。

于 2009-11-02T19:10:31.990 回答
0

除了 Juha 提到的选项之外,您还可以使用 NamedNativeQuery 和 SqlResultSetMapping 注释直接从 SQL 查询中创建对象。

@Entity
@SqlResultSetMapping(name = "compositekey", entities = 
  @EntityResult(entityClass = MiniBar.class, 
    fields = { @FieldResult(name = "miniBar", column = "BAR_ID"), })
)
@NamedNativeQuery(name = "compositekey", 
   query = "select BAR_ID from BAR", resultSetMapping = "compositekey")
@Table(name = "BAR")
public class Bar {

根据您的喜好调整 SQL 查询

于 2009-11-03T01:42:15.157 回答