这是查询。我希望这只是简单到足以转换。我刚接触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
感谢任何帮助。谢谢。
答案 0 :(得分:3)
根据JPA 2.0 specification(第11.1.6节),您不需要对@OneToMany
类型的类属性使用@OneToOne
或String
注释, :
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方法来访问或操作从数据库中读取的值。