我想知道是否有可能创建这样的查询:
em.createQuery(
"SELECT NEW EmpMenu(p.name, p.department.name) "
+ "FROM Project p ").getResultList();
Run Code Online (Sandbox Code Playgroud)
也可以通过规范来做到这一点:
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query,
CriteriaBuilder cb) {
return ???;
}
Run Code Online (Sandbox Code Playgroud)
提前致谢!
因此,经过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) 我想做这样的事情:
select count(*) from (select ...)
Run Code Online (Sandbox Code Playgroud)
(就像在SQL中一样),但在JPA中.
关于我将如何做的任何想法?
我在jpa中有关于Subquery类的问题.我需要创建带有两个自定义字段的子查询,但是子查询没有多选方法,而select方法有表达式输入参数(在查询中这是选择)和constact方法不合适.
关于加入子查询结果我也有疑问,有可能吗?怎么样?
我有:
连锁活动
public class Chain {
@Id
@Column(name = "chain_id")
@GeneratedValue(generator = "seq_cha_id", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "seq_cha_id", sequenceName = "SEQ_CHA_ID", allocationSize = 1)
private Long id;
@Column(name = "user_id")
private Long userId;
@Column(name = "operator_id")
private Long operatorId;
@Column(name = "subject")
private String subject;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "chain")
private List<Message> messages;
@Column(name = "status")
private Status status;
public Long getOperatorId() {
return operatorId;
}
public void setOperatorId(Long operatorId) {
this.operatorId = operatorId;
}
public …Run Code Online (Sandbox Code Playgroud) 如何在不使用元模型类的情况下制定以下JPA2条件查询:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Employee> cq = cb.createQuery(Employee.class);
Root<Employee> emp = cq.from(Employee.class);
cq.where(cb.isEmpty(emp.get(Employee_.projects)));
cq.select(emp);
Run Code Online (Sandbox Code Playgroud)
我想用:
cq.where(cb.isEmpty(emp.get("projects")));
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何将路径转换为表达式,这是cb.isEmpty所需要的......
谢谢.
我正在尝试获取在特定日期之后创建用户的文件夹的所有用户.用户和文件夹之间的关系存在于单独的表中.
这是我提出的查询,但是这个例外就是一个例子
没有明确的选择和隐含的感冒不被确定
代码
@Override
public List<RetailPostUserTbl> getNewUsersForSiteSince( Date date, Integer siteId )
{
List<RetailPostUserTbl> toReturn = new ArrayList<RetailPostUserTbl>();
EntityManager em = getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
Class<RpUserFolderMapTbl> userFolderPC = userFolderMapDAO.getPersistentClass();
CriteriaQuery<RpUserFolderMapTbl> mapQuery = cb.createQuery( userFolderPC );
Root<RpUserFolderMapTbl> root = mapQuery.from( userFolderPC );
Path<Integer> folderIdPath = root.get( RpUserFolderMapTbl_.folder ).get( FolderTbl_.folderId );
Predicate folderCondition = cb.equal( folderIdPath, siteId );
Subquery<RetailPostUserTbl> rpSubQ = mapQuery.subquery( persistentClass );
Root<RetailPostUserTbl> subQRoot = rpSubQ.from( persistentClass );
Path<UserTbl> userPath = subQRoot.get( RetailPostUserTbl_.user );
Path<Date> userCreatedPath = userPath.get( …Run Code Online (Sandbox Code Playgroud) 我有一个使用Hibernate 4.x的应用程序,它目前正在使用本机Hibernate API(意思是我有一个SessionFactory和Sessions).我刚刚注意到现有的Criteria API已被弃用,转而采用JPA(上级)Criteria API:
Hibernate提供了一个较旧的遗留
org.hibernate.CriteriaAPI,应该被视为已弃用.没有功能开发将针对这些API.最终,特定于Hibernate的标准功能将被移植为JPA的扩展javax.persistence.criteria.CriteriaQuery.
我不想将我的应用程序转换为EntityManager直接使用(即使Session从那里很容易获得Hibernate )因为我们有大量需要替换的自定义Hibernate配置逻辑.尽管如此,我肯定想开始使用JPA Criteria API,因为旧的API已被弃用(如果过去的Hibernate版本有任何迹象,可能会在未来的某个随机点消失),并且它们也提供了更好的类型安全性.
如果我正在使用SessionFactory/Session,我如何使用新的CriteriaQuery/CriteriaBuilder API?
我需要一个通用的Criterion强制结果零匹配.
有点像Restrictions.eq(true, false)?
这似乎是一个非常简单的问题,但我还没有找到一个确定的答案.我有一个DAO类,它通过使用条件查询自然地查询数据库.所以我想知道使用相同的CriteriaBuilder实现来创建不同的查询是否安全,或者我是否必须为每个查询创建新的CriteriaBuilder实例.下面的代码示例应说明我想要做的事情:
public class DAO() {
CriteriaBuilder cb = null;
public DAO() {
cb = getEntityManager().getCriteriaBuilder();
}
public List<String> getNames() {
CriteriaQuery<String> nameSearch = cb.createQuery(String.class);
...
}
public List<Address> getAddresses(String name) {
CriteriaQuery<Address> nameSearch = cb.createQuery(Address.class);
...
}
}
Run Code Online (Sandbox Code Playgroud)
这样做可以吗?