基于 Criteria API 的通用 findAll 查询生成错误 SQL

Generic findAll query based on Criteria API generates wrong SQL

我最近改编了一个更大的项目。我做的第一件事是更新 3 年前的依赖项(Hibernate 从 4.1.4 到 5.2.10,java 7 到 8,tomee 1.7.4 到 7.0.3)。
但是由于我对 Hibernate 升级不是很熟悉,所以我遇到了很多问题 运行。虽然到目前为止我能够解决其中的大部分问题,但我无法全神贯注于当前的问题。有一个现有的通用函数可以从 table.
中获取所有实体 基于条件创建了一个查询,但原始 SQL 查询似乎是错误的,因此没有返回任何数据;更准确地说:table 和列名没有被替换。您可以在下面的代码中找到的调试打印结果如下:

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;
}

抽象道:

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 的迁移指南也没有帮助。


我希望你能指导我找到解决方案。提前致谢,
丹尼尔

findAll()(不带参数)page传1。

query.setMaxResults((page - 1) * rowsPerPage);

结果 query.setMaxResults(0)

Hibernate 实现似乎发生了变化,正如您所说的那样,它之前一直运行良好。