最近大きなプロジェクトを採用しました。私が最初にしたのは、3歳の依存関係(Hibernateを4.1.4から5.2.10、Java 7から8、tomee 1.7.4から7.0.3へ)を更新することでした。
しかし、私はHibernateに精通していないので、アップグレードは数多くの問題にぶつかってきたので挑戦しています。私は今までほとんどのものを解決することができましたが、私は現在のものに私の頭を包み込むことはできません。テーブルからすべてのエンティティをフェッチするための既存の汎用関数があります。
クエリは条件に基づいて作成されますが、生のSQLクエリは間違っているようで、データは返されません。より正確には、テーブル名とカラム名は置き換えられません。次で結果以下のコードで見つけることができるデバッグプリント:Criteria APIに基づいた一般的なfindAllクエリで間違ったSQLが生成される
select generatedAlias0 from TestReferenceEntity as generatedAlias0
エンティティ:
@Entity
@Table(name = "TEST_TYPE_REF")
@NamedQueries({@NamedQuery(name = "findTestEntityByName", query = "SELECT bt FROM TestReferenceEntity bt WHERE bt.name = :name") })
public class TestReferenceEntity extends AbstractEntity {
public static final String FIND_BY_NAME = "findTestEntityByName";
public static final String TYPENAME_PARAM_NAME = "name";
@NotNull
@Size(max = 50)
@Column(name = "NAME")
private String name;
@Size(max = 50)
@Column(name = "PREFIX")
private String prefix;
@Size(max = 100)
@Column(name = "IDENT_REGEXP")
private String regexp;
}
AbstractDao:
public abstract class AbstractDao<E extends AbstractEntity> implements AbstractService<E> {
public static final String PERSISTENCE_UNIT = "MeineJpaPU";
private static Logger LOG = Logger.getLogger(AbstractDao.class);
@PersistenceContext(unitName = PERSISTENCE_UNIT)
private EntityManager em;
@Inject
private UserService userService;
private E entityClass; //This is set elsewhere
public List<E> findAll() {
return findAll(1, 1000);
}
public List<E> findAll(final int page, final int rowsPerPage) {
final Class<E> clazz = getEntityClass(); //TestReferenceEntity.class
final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<E> criteria = cb.createQuery(clazz);
final Root<E> r = criteria.from(clazz);
criteria.select(r);
final TypedQuery<E> query = getEntityManager().createQuery(criteria);
query.setFirstResult(page - 1);
query.setMaxResults((page - 1) * rowsPerPage);
System.out.println(">>>>>>>>>>>> " + query.unwrap(org.hibernate.Query.class).getQueryString());
return query.getResultList(); //Empty - but there is data in the table
}
}
のpersistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="MeineJpaPU" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>java:openejb/Resource/jdbc/PROJECTNAME</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
</persistence-unit>
</persistence>
私の推測では、後のバージョンのHibernateで追加されたいくつかの重要な部分(注釈?)が不足しています。私たちが使用したすべてのバージョンは少し古いものでした。 この問題を調査しましたが、私の問題と一致するものは見つかりませんでした。 Hibernateの移行ガイドも役に立ちませんでした。
私はあなたが解決に向けて私を導くことができると思います。事前に感謝します。
ダニエル
生成された実際のSQLを共有するように注意してください。一見、JPQLを投稿するからです。 –
SQL文が実行されていないようです。私はこれを確認するために私のMySQLインスタンスでクエリログを有効にしました。例外もスローされないのは面白いです。 さらにデバッグを行うとどうなりますか?私は実行されるものを印刷したクエリではありませんか?前述のように、私はこのプロジェクトを最近改造しただけで、それを適切にデバッグ/修正するために十分な時間を冬眠状態にしていません。 – Ch4t4r
'getResultList()'を呼び出すとき(少なくとも使用しているJPAプロバイダを使用していて、あなたが選んだJPAプロバイダではない場合)、SQLは常に実行されます。そうでない場合、JPAプロバイダのバグを報告します –