加入中的子查询

时间:2013-07-10 07:15:48

标签: java sql jpa querydsl

我需要从数据库中选择具有活动地址的公司(address.address_status_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 个答案:

答案 0 :(得分:6)

也许就像这样

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)

答案 1 :(得分:1)

我会使用Oracle DB JDBC。你可以得到here

根据您正在尝试构建Applet或应用程序,您必须在JDBC的小版本和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();
    }
}

希望这可以帮助你。

此致 安迪