我们有一个映射到hibernate实体的数据库表。到目前为止一切顺利......
然而,我们想要的只是映射满足特定标准的恩赐,例如'distinct(fieldA,fieldB)'......
是否可以使用hibernate和hibernate注释进行映射?我们怎么做?使用@Filter?
答案 0 :(得分: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;
...
}
答案 1 :(得分:0)
您可以创建一个视图,然后将该视图映射到实体:
create view my_data as
select ... from ...
@Entity(table="my_data")
public class MyData { ... }
一种选择是正常映射表格,然后您可以通过查询或filter获取您的始终实体。
您还可以制作native SQL query并在结果上映射实体:
Query q = sess.createSQLQuery("SELECT DISTINCT fieldA, fieldB FROM some_table")
.addEntity(MyEntity.class);
List<MyEntity> cats = q.list();
也可以将DISTINCT添加到此类HQL query:
select new Family(mother, mate, offspr)
from DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr
方法1,3和4将进行只读映射。
您能否更具体地说明您使用的标准?视图方法更通用,因为您无法使用hibernate查询或过滤器执行所有操作。
答案 2 :(得分:0)
也许你可以创建一个新的Pojo来封装字段和它们应该静态的条件。然后将该类设置为“自定义用户定义类型”,这样Hibernate必须使用您提供的映射类来映射“类型”..
答案 3 :(得分: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查询