如何将此jdbc查询转换为JPA(JPQL)

时间:2016-03-19 09:10:24

标签: hibernate jpa orm jpa-2.0 jpql

这是查询。我希望这只是简单到足以转换。我刚接触JPA,特别是JPQL,我们希望转换此查询。

select t1.field1, t1.field2, t1.field3 from TABLE_ONE t1, TABLE_TWO t2, TABLE_THREE t3 where t1.field2 = t2.field1 and t1.field3 = t3.field1 and t1.field1 = '123'

我已经开始创建实体对象......

@Entity
@Table(name="TABLE_ONE")
public class TableOne {
       @Column(name="field1")
       private String field1;

       @Column(name="field2")
       private String field2;

TableTwo和TableThree类相同。

如果您需要使用@OneToMany@OneToOne标记在JPQL中翻译该查询,我感到很困惑。我想,为那个特定的查询创建这些标签是不切实际的。顺便说一句,这是JPA 2.0

感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:3)

根据JPA 2.0 specification(第11.1.6节),您不需要对@OneToMany类型的类属性使用@OneToOneString注释, :

  

Basic annotation是到数据库列的最简单映射类型。 Basic注释   可以应用于以下任何类型的持久属性或实例变量:Java原语   类型,基本类型的包装器,java.lang.String,...,java.util.Date,java.util.Calendar,java.sql.Date,   java.sql.Time,java.sql.Timestamp,byte [],Byte [],char [],Character [],   枚举,以及实现Serializable的任何其他类型。

     

如第2.8节所述,对于这些类型的持久字段和属性,使用Basic注释是可选。如果是Basic注释   对于此类字段或属性,未指定,将应用基本注释的默认值

这是符合JPA的ORM实现的保证行为。此外,在使用@Column注释时,还会给出String类属性的持久性,但是,@Column可用于影响数据库特定属性(例如,字段长度,名称,可空)等等......更明确地表达某个属性。

原生JDBC查询的翻译应该适用于您:

String jpqlConformQueryString = 
    "SELECT t1 from TableOne t1, TableTwo t2, TableThree t3 WHERE "+
    "t1.field2 = t2.field1 AND "+
    "t1.field3 = t3.field1 AND "+
    "t1.field1 = :field1";

// create a typed query to fetch only objects of that type
TypedQuery<TableOne> query = em.createQuery(jpqlConformQueryString, TableOne.class);

// set the value of the parameter "field1" to a value you choose...
query.setParameter("field1", "123");

// retrieve objects (transformed tuples) matching previously defined and parameterized query 
List<TableOne> result = query.getResultList();

// process the result list further 
// ...

这样,列表“result”将仅引用与变量jpqlConformQueryString中指定的条件匹配且受t1.field1的显式参数限制的对象。

注意:您不必选择某些属性,例如普通的JDBC代码。而是选择整个对象并使用每个对象的getter / setter方法来访问或操作从数据库中读取的值。