최근에 더 큰 프로젝트를 조정했습니다. 내가 한 첫 번째 일은 3 년 된 종속성을 업데이트하는 것입니다 (Hibernate가 4.1.4에서 5.2.10, Java 7에서 8, tomee 1.7.4에서 7.0.3).
그러나 내가 Hibernate에 정확히 익숙하지 않기 때문에 수많은 문제에 부딪 혔기 때문에 업그레이드는 도전이었습니다. 지금까지 대부분의 문제를 해결할 수 있었지만 현재의 문제로 머리를 감을 수는 없습니다. 테이블에서 모든 엔티티를 가져 오는 기존의 일반 함수가 있습니다.
기준에 따라 쿼리가 생성되지만 원시 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의 마이그레이션 가이드도 도움이되지 않았습니다.
나는 당신이 나를 해결책으로 인도 할 수 있기를 바랍니다. 미리 감사드립니다,
Daniel
findAll()
(매개 변수 없음)은 페이지에 대해 1을 전달합니다.
query.setMaxResults((page - 1) * rowsPerPage);
결과는 query.setMaxResults(0)
.
이전에 잘 작동한다고 말했듯이 Hibernate 구현이 변경된 것 같습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다