JPA / Hibernate加入恒定价值
我正在尝试使用join语句中的常量值连接到同一个表中的不同实体。 在SQL中,我会做这样的事情……
SELECT * FROM owner o JOIN types t on t.owner_id = o.id AND t.type = 'A' -- ^^^^^^^^^^^^^^^^ THIS IS WHAT I AM TRYING TO REPLICATE
在Java + JPA / Hibernate中,我试图做这样的事情……
@Entity @Table(name = "OWNER") public class Owner { @Id @Column(name="ID") private Long id @OneToOne(mappedBy = "owner", fetch = FetchType.EAGER, cascade = CascadeType.ALL) @JoinColumns({ @JoinColumn(name = "ID", referencedColumnName = "ID"), @JoinColumn(constantValue = "A", referencedColumnName="type")}) // ^^^^^^^^^^^^^^^^^^^ I AM LOOKING FOR SOMETHING THAT DOES THIS. // constantValue IS NOT A VALID ARGUMENT HERE. private TypeA inspectionSnapshot; @OneToOne(mappedBy = "owner", fetch = FetchType.EAGER, cascade = CascadeType.ALL) @JoinColumns({ @JoinColumn(name = "ID", referencedColumnName = "ID"), @JoinColumn(constantValue = "B", referencedColumnName="type")}) private TypeB inspectionSnapshot; /* Getters & Setters ... */ } @Entity @Table(name = "TYPES") @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING) public abstract class BaseType { @Id @OneToOne @JoinColumn(name = "OWNER_ID", referencedColumnName="ID") private Owner id; @Id @Column(name = "TYPE") private char type /* Getters & Setters ... */ } @Entity @DiscriminatorValue("A") public class TypeA extends BaseType { /* All functionality in BaseType */ } @Entity @DiscriminatorValue("B") public class TypeA extends BaseType { /* All functionality in BaseType */ }
提前致谢!
你正在寻找非标准的连接。 这是处理这种情况的文档:
http://docs.oracle.com/cd/E13189_01/kodo/docs40/full/html/ref_guide_mapping_notes_nonstdjoins.html
希望能帮助到你!
如果您不介意使用特定于Hibernate的注释,可以尝试使用@WhereJoinTable
注释,例如:
@OneToOne(mappedBy = "owner", fetch = FetchType.EAGER, cascade = CascadeType.ALL) @JoinColumn(name = "ID", referencedColumnName = "ID") @WhereJoinTable(clause = "TYPE = 'A'") private TypeA inspectionSnapshot;
请注意, clause
属性必须包含SQL,而不是JPQL,因此您需要使用数据库列名而不是JPA实体字段名。
尝试将常量指定为公式的值
@JoinColumnsOrFormulas({ @JoinColumnOrFormula(formula=@JoinFormula(value="'A'", referencedColumnName="type")), @JoinColumnOrFormula(column = @JoinColumn("id", referencedColumnName="id")) }) private TypeA inspectionSnapshot;
- postInstantiate buildSessionFactory慢/内存庞大的数据库
- 一对一映射的概念。 解释映射
- 测试DAO时出错:sun.reflect.generics.reflectiveObjects.TypeVariableImpl无法强制转换为java.lang.Class
- Weblogic 12hibernatevalidationexception
- java.lang.IllegalStateException:具有@ManyToMany 3实体的同一实体的多个表示forms
- Criteria API返回的结果集太小
- Hibernate向数据库发送多余的查询
- Hibernate命名查询是否是真正意义上的预编译?
- 如何为超类编写Hibernate Criteria查询,并检查某个子类?