mirror of https://github.com/apache/openjpa.git
OPENJPA-2289: Applied Albert's patch to trunk
git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@1415702 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
9fa9ef4fe8
commit
2d5ab5c862
|
@ -1877,6 +1877,10 @@ public class DBDictionary
|
|||
else if (!StringUtils.isEmpty(syntax))
|
||||
throw new IllegalArgumentException(syntax);
|
||||
}
|
||||
|
||||
public boolean isImplicitJoin() {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a SQL string to act as a placeholder for the given column.
|
||||
|
|
|
@ -1366,6 +1366,10 @@ public class OracleDictionary
|
|||
}
|
||||
}
|
||||
|
||||
public boolean isImplicitJoin() {
|
||||
return joinSyntax == SYNTAX_DATABASE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Oracle requires special handling of XML column.
|
||||
* Unless the value length is less or equal to 4000 bytes,
|
||||
|
|
|
@ -2847,7 +2847,11 @@ public class SelectImpl
|
|||
|| _sel._from != null) {
|
||||
// don't make any joins, but update the path if a variable
|
||||
// has been set
|
||||
this.append(this.var);
|
||||
if (this.var != null) {
|
||||
this.append(this.var);
|
||||
} else if (this.path == null && this.correlatedVar != null && _sel._dict.isImplicitJoin()) {
|
||||
this.append(this.correlatedVar);
|
||||
}
|
||||
this.var = null;
|
||||
_outer = false;
|
||||
return this;
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.apache.openjpa.persistence.jdbc.query.sub;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.Table;
|
||||
|
||||
@Entity
|
||||
@Table(name = "OPENJPA_MAXQUERY_ENTITY")
|
||||
public class MaxQueryEntity {
|
||||
|
||||
public MaxQueryEntity() {
|
||||
}
|
||||
|
||||
public MaxQueryEntity(int id, int domainId, int revision) {
|
||||
this.id = id;
|
||||
this.domainId = domainId;
|
||||
this.revision = revision;
|
||||
}
|
||||
|
||||
@Id
|
||||
private int id;
|
||||
|
||||
private int domainId;
|
||||
|
||||
private int revision;
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public int getRevision() {
|
||||
return revision;
|
||||
}
|
||||
|
||||
public void setRevision(int revision) {
|
||||
this.revision = revision;
|
||||
}
|
||||
|
||||
public int getDomainId() {
|
||||
return domainId;
|
||||
}
|
||||
|
||||
public void setDomainId(int domainId) {
|
||||
this.domainId = domainId;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,83 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.apache.openjpa.persistence.jdbc.query.sub;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.JoinColumn;
|
||||
import javax.persistence.ManyToOne;
|
||||
import javax.persistence.Table;
|
||||
|
||||
@Entity
|
||||
@Table(name = "OPENJPA_MAXQUERY_MAPENTITY")
|
||||
public class MaxQueryMapEntity {
|
||||
|
||||
public MaxQueryMapEntity(int id, int revision, String selectCriteria) {
|
||||
this.id = id;
|
||||
this.revision = revision;
|
||||
this.selectCriteria = selectCriteria;
|
||||
}
|
||||
|
||||
public MaxQueryMapEntity() {
|
||||
}
|
||||
|
||||
@Id
|
||||
private int id;
|
||||
|
||||
private int revision;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "refEntity")
|
||||
private MaxQueryEntity refEntity;
|
||||
|
||||
private String selectCriteria;
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public int getRevision() {
|
||||
return revision;
|
||||
}
|
||||
|
||||
public void setRevision(int revision) {
|
||||
this.revision = revision;
|
||||
}
|
||||
|
||||
public MaxQueryEntity getRefEntity() {
|
||||
return refEntity;
|
||||
}
|
||||
|
||||
public void setRefEntity(MaxQueryEntity refEntity) {
|
||||
this.refEntity = refEntity;
|
||||
}
|
||||
|
||||
public String getSelectCriteria() {
|
||||
return selectCriteria;
|
||||
}
|
||||
|
||||
public void setSelectCriteria(String selectCriteria) {
|
||||
this.selectCriteria = selectCriteria;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,92 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.apache.openjpa.persistence.jdbc.query.sub;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.EntityTransaction;
|
||||
import javax.persistence.Query;
|
||||
|
||||
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
|
||||
|
||||
public class TestSubQuery extends SingleEMFTestCase {
|
||||
public void setUp() throws Exception {
|
||||
super.setUp(CLEAR_TABLES, MaxQueryEntity.class, MaxQueryMapEntity.class);
|
||||
populate();
|
||||
}
|
||||
|
||||
public void populate() {
|
||||
EntityManager em = emf.createEntityManager();
|
||||
EntityTransaction tran = em.getTransaction();
|
||||
tran.begin();
|
||||
|
||||
MaxQueryEntity mqe = new MaxQueryEntity(1, 1, 1);
|
||||
MaxQueryMapEntity mqme = new MaxQueryMapEntity(1, 1, "A1");
|
||||
MaxQueryMapEntity mqme2 = new MaxQueryMapEntity(2, 2, "A2");
|
||||
mqme.setRefEntity(mqe);
|
||||
mqme2.setRefEntity(mqe);
|
||||
em.persist(mqe);
|
||||
em.persist(mqme);
|
||||
em.persist(mqme2);
|
||||
|
||||
mqe = new MaxQueryEntity(2, 2, 1);
|
||||
mqme = new MaxQueryMapEntity(3, 1, "B1");
|
||||
mqme.setRefEntity(mqe);
|
||||
em.persist(mqe);
|
||||
em.persist(mqme);
|
||||
mqme = new MaxQueryMapEntity(4, 2, "B2");
|
||||
mqme.setRefEntity(mqe);
|
||||
em.persist(mqme);
|
||||
mqme = new MaxQueryMapEntity(5, 3, "B3");
|
||||
mqme.setRefEntity(mqe);
|
||||
em.persist(mqme);
|
||||
|
||||
mqe = new MaxQueryEntity(3, 3, 1);
|
||||
mqme = new MaxQueryMapEntity(6, 4, "C1");
|
||||
mqme.setRefEntity(mqe);
|
||||
em.persist(mqe);
|
||||
em.persist(mqme);
|
||||
|
||||
tran.commit();
|
||||
em.close();
|
||||
}
|
||||
|
||||
public void test() {
|
||||
EntityManager em = emf.createEntityManager();
|
||||
|
||||
Query query =
|
||||
em
|
||||
.createQuery("SELECT e FROM MaxQueryEntity e, MaxQueryMapEntity map "
|
||||
+ "WHERE "
|
||||
// + " map.selectCriteria = 'B3' "
|
||||
// + " AND map.refEntity = e "
|
||||
// + " AND e.revision = ( SELECT MAX(e_.revision)"
|
||||
// + " FROM MaxQueryEntity e_"
|
||||
// + " WHERE e_.domainId = e.domainId )"
|
||||
// + " AND "
|
||||
+ " map.revision = ( SELECT MAX(map_.revision)"
|
||||
+ " FROM MaxQueryMapEntity map_"
|
||||
+ " WHERE map_.refEntity = map.refEntity )"
|
||||
);
|
||||
|
||||
// assertEquals(1, query.getResultList().size());
|
||||
assertEquals(9, query.getResultList().size());
|
||||
|
||||
em.close();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue