5

データベースから会社をアクティブなアドレス (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) は、JOIN 句でのサブクエリをサポートしていません。

JPA/QueryDSLで表現できるようにSQL文を言い換える方法はありますか?

編集: 違いがある場合は、Oracle DB と Hibernate JPA プロバイダーを使用しています。

4

2 に答える 2

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)
于 2013-07-10T12:27:22.277 に答える
1

Oracle DB JDBC を使用します。ここで入手できます。

アプレットまたはアプリケーションを構築しようとしているかどうかに応じて、JDBC の小さいバージョンと OCI バージョンのどちらかを選択する必要があります。詳細については、こちらをご覧ください。

アプリケーションを構築していると仮定するため、この例では 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();
    }
}

これがお役に立てば幸いです。

よろしく、アンディ

于 2013-07-10T08:53:56.553 に答える