我需要从数据库中选择具有活动地址的公司(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提供程序。
答案 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();
}
}
希望这可以帮助你。
此致 安迪