【问题标题】:How to translate this jdbc query to JPA (JPQL)如何将此 jdbc 查询转换为 JPA (JPQL)
【发布时间】:2016-07-06 02:58:28
【问题描述】:

这是查询。我希望这很简单,可以转换。我刚接触 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

感谢任何帮助。谢谢你。

【问题讨论】:

    标签: hibernate jpa orm jpa-2.0 jpql


    【解决方案1】:

    根据JPA 2.0 specification(第11.1.6节),您不需要为String类型的类属性使用@OneToMany@OneToOne注解,如:

    基本注释是映射到数据库列的最简单类型。 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 
    // ...
    

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

    请注意:您不必像在纯 JDBC 代码中那样选择某些属性。相反,您选择整个对象并使用每个对象的 getter/setter 方法来访问或操作已从数据库读取的值。

    【讨论】:

    • 如果我的 jdbc 查询有左/右连接怎么办?我可以这样做吗?
    • 那将是一个不同的问题。问一个新的Q,我会尽力而为。顺便说一句:以上答案是否为您的问题提供了解决方案?
    • 我周一回去工作的时候试试。感谢您的回答。
    • 成功了!谢谢!但是这种查询在 JPQL 中是否可取?还是建议将 join 与 @OneToMany 标记一起使用,反之亦然?
    • 如果您有涉及 OneToMany 或类似注释的不同映射,请提出一个新问题,因为这是 StoF 背后的想法。简而言之:基于真实 FK 的连接操作需要在 JPQL 中以不同方式表述,但同样:这是一个孤立的问题。
    猜你喜欢
    • 1970-01-01
    • 2021-10-09
    • 2014-01-17
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 2021-04-03
    相关资源
    最近更新 更多