我最近适应更大的项目。我做的第一件事是更新3年前的依赖关系(Hibernate从4.1.4到5.2.10,java 7到8,tomee 1.7.4到7.0.3)。
但是,由于我并不完全熟悉Hibernate升级是一个挑战,因为我遇到了很多问题。虽然到目前为止我能够解决其中的大部分问题,但我无法将自己的头围绕在当前的问题上。有一个现有的通用函数来从表中获取所有实体。
查询是基于条件创建的,但原始SQL查询似乎是错误的,因此没有数据返回;更确切地说:表格和列名不会被替换。调试打印,你可以找到下面的结果代码如下所示:基于标准的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实例上启用了查询日志记录来验证这一点。有趣的是,也没有抛出异常。 我将如何去调试甚至更多?是不是我打印的那个会被执行的查询?正如我刚才提到的,我最近只适应了这个项目,并且不熟悉hibernate来正确调试/修复它。 – Ch4t4r
当你调用'getResultList()'(或者至少是用于我使用的JPA提供者,而不是你选择的那个)时,SQL总是被执行(或者至少应该是)。如果不是,那么你在JPA提供程序中报告错误 –