hibernate实体

nukf8bse  于 2021-07-05  发布在  Java
关注(0)|答案(4)|浏览(422)

我们有一个Map到hibernate实体的db表。到目前为止一切顺利。。。
然而,我们想要的是只Map满足特定标准的实体,比如“distinct(fielda,fieldb)”。。。
是否可以使用hibernate和hibernate注解进行Map?我们怎么做?用@filter?

pgky5nke

pgky5nke1#

您可以创建一个视图,然后将该视图Map到实体:

create view my_data as
select ... from ...

@Entity(table="my_data")
public class MyData { ... }

一种方法是正常Map表,然后可以通过查询或过滤器获取always实体。
您还可以进行本机sql查询并将实体Map到结果:

Query q = sess.createSQLQuery("SELECT DISTINCT fieldA, fieldB FROM some_table")
          .addEntity(MyEntity.class);
List<MyEntity> cats = q.list();

也可以将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将生成只读Map。
你能更具体地说明你使用的标准吗?视图方法更通用,因为不能用hibernate查询或过滤器完成所有操作。

fdbelqdn

fdbelqdn2#

除了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查询

qjp7pelc

qjp7pelc3#

也许您可以创建一个新的pojo来封装字段和它们应该统计的条件。然后将该类设置为“自定义用户定义类型”,这样hibernate就必须使用您提供的Map类来Map该“类型”。。

px9o7tmv

px9o7tmv4#

我建议你使用 @Where 注解。此注解可用于集合的元素实体或目标实体。您提供了一个用sql编写的子句属性,该属性将应用于hibernate对该实体执行的任何select。这是非常容易使用和非常可读。
下面是一个例子。

@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;

...

}

相关问题