因此,经过10年多的休整,我将回到Java并尝试使用JPA和Java泛型.我已经创建了一个基于泛型的findAll(other)JPA查询
SELECT * FROM source WHERE other_id = other.id;
Run Code Online (Sandbox Code Playgroud)
这是我要去的地方.它有效,但我想知道是否有更好,更清洁的方法来做到这一点.使用ManagedType很难,并没有太多完整的文档或简单的例子.
我决定尽可能保持我的代码通用(没有双关语),所以我使用JPA2.
这是所有实体类的根.我可能不需要它,但它阻止我有基本的错误.
import java.io.Serializable;
public abstract class DomainObject implements Serializable {
private static final long serialVersionUID = 1L;
public abstract void setId(Long id);
public abstract Long getId();
}
Run Code Online (Sandbox Code Playgroud)
这是抽象的DAO类.我为实现类扩展了这个,因为我需要更具体地做其他活动 - 主要是确保加载延迟集.
public abstract class GenericDAOImpl<T extends DomainObject, T2 extends DomainObject> implements GenericDAO<T, T2> {
private Class<T> type;
@PersistenceContext
protected EntityManager entityManager;
public GenericDAOImpl(Class<T> type) {
super();
this.type = type;
}
... save and delete classes go …Run Code Online (Sandbox Code Playgroud) 可以用Hibernate做这个吗?
select A.something, B.something, C.something, D.something , E.*
from A
LEFT OUTER JOIN B on A.id = B.id_fk
LEFT OUTER JOIN C ON B.id = C.id_fk
LEFT OUTER JOIN D ON C.id = D.id_fk
LEFT OUTER JOIN E ON A.abc = E.abc;
Run Code Online (Sandbox Code Playgroud)
这个查询在SQL中运行正常,但在Hibernate中给出了以下Exception:
org.hibernate.hql.ast.QuerySyntaxException: expecting IDENT, found '*' near line 1
Run Code Online (Sandbox Code Playgroud)