有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

join中的java子查询

我需要从数据库中选择具有活动地址(address.address\u status\u id=1)的公司。如果地址处于非活动状态,则地址列应包含空值

以下查询完全符合我的要求:

select c.id, c.name, a.id, a.street
from company c
left join 
(select * from address where address_status_id = 1) a 
on c.id = a.company_id

我在Java/QueryDSL中尝试过这个:

JPAQuery query = new JPAQuery(entityManager);
query = query.from(qCompany);
query = query.leftJoin(company.addresses, new JPASubQuery().from(qAddress)    
.where(qAddress.addressStatusId.eq(AddressStatuss.ACTIVE.asBigDecimal())).list(qAddress));

然而,JPA(因此QueryDSL中的JPAQuery)不支持a subquery in a JOIN clause

有没有一种方法可以重新表述SQL语句,以便它可以用JPA/QueryDSL表示

编辑:如果Oracle DB和Hibernate JPA提供程序有所不同,我们将使用它们


共 (2) 个答案

  1. # 1 楼答案

    也许像这样

    select c.id, c.name, a.id, a.street
    from Company c
    left join c.addresses a on a.addressStatusId = 1
    

    在Querydsl

    query.from(c)
         .leftJoin(c.addresses, a)
         .on(a.addressStatusId.eq(1))
         .list(c.id, c.name, a.id, a.street)
    
  2. # 2 楼答案

    我会使用OracleDBJDBC。你可以得到here

    根据您是尝试构建小程序还是应用程序,您必须在JDBC的tiny版本和OCI版本之间进行选择。关于该here的更多信息

    我将假设您正在构建一个应用程序,因此在本例中我将使用OCI

    Class.forName("oracle.jdbc.OracleDriver");
    Connection con = null;
    Statement stmt = null;
    ResultSet rset = null;
    try{
        con = DriverManager.getConnection("jdbc:oracle:oci:@//192.168.1.100", "user", "password");
    
        stmt = con.prepareStatement();
    
        rset = stmt.executeQuery("SELECT name, address, phonenumber FROM tbl_comanies");
    
        while(rset.next()){
            String name = rset.getString(1);
            String address = rset.getString(2);
            int phonenumber = rset.getInt(3);
            //The number passed to the get...()-Method is the place in the SQL query. (Here, name=1, address=2, phonenumber=3)
        }
    } catch (SQLException ex) {
        System.out.println(ex.getMessage());
    } finally {
        try {
            if(rset != null)
                rset.close();
            if(stmt != null)
                stmt.close();
            if(con != null)
                con.close();
        }
    }
    

    希望这对你有所帮助

    问候,, 安迪