JPA继承问题,为什么生成的查询在wildfly10和jboss7之间是不同的

时间:2017-02-27 19:55:01

标签: jpa inheritance jboss7.x wildfly-10

我正在将项目从jboss7迁移到wildfly10。奇怪的是,jboss中生成的查询在wildfly10中有所不同,这导致表结构必须更改,但不是预期的。

public class BaseAnnotation implements Serializable {
  private static final long serialVersionUID = 6636704943305921427L;
}


@Entity
@Table(name="one")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class oneBaseAnnotation extends BaseAnnotation {
@Id
@GeneratedValue(generator = "baseAnnotationSequencer")
@SequenceGenerator(name = "baseAnnotationSequencer", sequenceName = "BASEANNOTATION_SEQ")
private Long id;

private String annotationType;
.....
}

@Entity
public class TwoStructureAnnotation extends oneBaseAnnotation {

private static final long serialVersionUID = -5838272604038154615L;

@OneToMany
@JoinTable(name= "CSA_CS")
private List<TwoStructure> twoStructures = new ArrayList<TwoStructure>();

public TwoStructureAnnotation() {
    setAnnotationType("Two Structure");
}
.....
}

public class..... {
   protected List<T> createQuery(int first, int pageSize,
        List<SortMeta> multiSortMeta, Map<String, String> filters,
        String joinField) {
    // Setup
    CriteriaBuilder cb = getObjectEntityManager().getCriteriaBuilder();
    CriteriaQuery<T> criteria = (CriteriaQuery<T>) cb.createQuery();
    Root<A> annotationRoot = criteria.from(TwoStructureAnnotation.class);
    ListJoin<A, T> joinRoot = annotationRoot.joinList("twosStructures");
    Predicate restrictions = cb.conjunction();

    // Filter
    filters.putAll(this.getBaseFilter());
    restrictions = cb.and(restrictions,
            createGlobalFilter(filters, joinRoot, cb));

    restrictions = cb.and(restrictions,
            cb.equal(annotationRoot, annotation));
    ...
    // Query creation
    criteria.where(restrictions);
    criteria.select(joinRoot);

    // Restrict Returns
    TypedQuery<T> returnQuery = getObjectEntityManager().createQuery(
            criteria);
    returnQuery.setFirstResult(first);
    returnQuery.setMaxResults(pageSize);

    List<T> results = returnQuery.getResultList();

    ....}

下面的查询,与表CSA_CS上的inner join中的密钥不同。我不知道为什么,请建议我,谢谢。

- 在Jboss7中

select * from
( select
    crystalstr2_.id as id1_43_,
    crystalstr2_.pdbEntry_id as pdbEntry_id3_43_,
    crystalstr2_.title as title2_43_ 
from
    ONE crystalstr0_ 
inner join
    CSA_CS crystalstr1_ 
        on crystalstr0_.id=crystalstr1_.ONE_id 
inner join
    TwoStructure crystalstr2_ 
        on crystalstr1_.crystalStructures_id=crystalstr2_.id 
where
    crystalstr0_.DTYPE='TwoStructureAnnotation' 
    and 1=1 
    and 1=1 
    and crystalstr0_.id=? ) 
where
rownum <= ?

---在wildfly10

select
 * 
from
 ( select
     crystalstr2_.id as id1_36_,
     crystalstr2_.pdbEntry_id as pdbEntry_id3_36_,
     crystalstr2_.title as title2_36_ 
 from
     ONE crystalstr0_ 
 inner join
     CSA_CS crystalstr1_ 
         on crystalstr0_.id=crystalstr1_.TWOStructureAnnotation_id 
 inner join
     TwoStructure crystalstr2_ 
         on crystalstr1_.crystalStructures_id=crystalstr2_.id 
 where
     crystalstr0_.DTYPE='TwoStructureAnnotation' 
     and 1=1 
     and 1=1 
     and crystalstr0_.id=? ) 
 where
 rownum <= ?

表:

table-TWOSTRUCTURE
ID
TITLE

table-CSA_CS
ONE_ID
CRYSTALSTRUCTURES_ID

table-ONE
DTYPE
ID
ANNOTATIONTYPE

1 个答案:

答案 0 :(得分:0)

JBoss7发布hibernate 4.x和wildfly 10发布hibernate 5.在hibernate 5中,Oracle实现了内部联接&#39;。如果你使用Oracle10gDialect,那么 Oracle10gDialect增加了对ANSI连接的支持。子类(例如Oracle12cDialect)继承此功能。