java - 在两个平面表上编写 Hibernate 或 JPA native SQL

标签 java sql hibernate jpa stored-procedures

我有两张平板 table 。他们之间没有关系。我必须使用 JPA 或 Hibernate,并使用 hql 或 native sql 查询从这些表中检索数据。该查询是存储过程的一部分。因此,我的另一个选择是调用此引用游标存储过程并检索数据。

这是我的查询。

/ * GET ALL THE COLUMNS FROM T2 */
SELECT 
     T2.*    
    FROM TABLE1 T1, TABLE2 T2
    WHERE T1.USERID = 'TESTUSER'    AND T2.GROUP_CAT IN (
    T1.GROUPCAT1,T1.GROUPCAT2,T1.GROUPCAT3,T1.GROUPCAT4, T1.GROUPCAT5)

如何在 Hibernate 或 JPA 中编写检索数据?

最佳答案

  1. 为表 T2 创建 hibernate 实体 (T2Entity)。
  2. 为实体T2创建一个DAO,我们将其命名为T2Dao,它继承自通用Dao。
  3. 实体管理器使用以下注释注入(inject)到通用 Dao 中:

    @PersistenceContext
    EntityManager entityManager;
    

    它有entityManager的setter和getter方法。

  4. 在T2Dao中,定义如下方法(使用JPA):

    公共(public)列表findT2Entities() {

    String nativeSQL = "SELECT T2.* FROM TABLE1 T1, TABLE2 T2 WHERE T1.USERID = 'TESTUSER'    AND T2.GROUP_CAT IN (T1.GROUPCAT1,T1.GROUPCAT2,T1.GROUPCAT3,T1.GROUPCAT4, T1.GROUPCAT5)";
    
    Query q=this.getEntityManager().createNativeQuery(nativeSQL,T2Entity.class);
    
    try{
        List<T2Entity> t2EntityList  = (List<T2Entity>) q.getResultList();
        return t2EntityList;
    }catch(NoResultException e){
        return null;
    }
    

    }

  5. 为了获得更好的性能,请在数据库中对T1.USERID、T2.GROUP_CAT等列建立索引;确保nativeSQL不对表进行顺序扫描。

您可以根据您的用例进行其他优化。

关于java - 在两个平面表上编写 Hibernate 或 JPA native SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21943459/

相关文章:

java - 哪种数据格式适合将数据(左连接数据库查询的结果)从 servlet 传输到 JSP?

sql - 无法使用创建的新用户登录到 sql server

sql - DB2 SQL 脚本 : how to start a transaction and rollback on error

java - 如何使用 Guava MapInterfaceTest 来测试您的类

java - Gradle java Web 应用程序无法在 heroku 上启动

php - 如何从第一个mysql表获取多个值并在第二个查询中使用它?

mysql - 在 PrimeFaces 中显示和编辑设置值

java - JPA Embeddable 类可以包含对象引用吗?

java - 我已经添加了所需的依赖项,但仍然遇到错误

java - 多客户端聊天程序,向所有客户端广播聊天?