Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jakarta ee 在JPA中使用TypedQuery代替普通查询_Jakarta Ee_Jpa_Glassfish 3_Jpql - Fatal编程技术网

Jakarta ee 在JPA中使用TypedQuery代替普通查询

Jakarta ee 在JPA中使用TypedQuery代替普通查询,jakarta-ee,jpa,glassfish-3,jpql,Jakarta Ee,Jpa,Glassfish 3,Jpql,是否可以将此查询编写为TypedQuery,并让两个Long运行到一个包含两个公共Long字段的对象中 Query q = em.createQuery( "SELECT c.id, COUNT(t.id) " + "FROM PubText t " + "JOIN t.comm c " + "WHERE c.element = ?1 " + "GROUP BY c.i

是否可以将此查询编写为TypedQuery,并让两个Long运行到一个包含两个公共Long字段的对象中

    Query q = em.createQuery(
            "SELECT c.id, COUNT(t.id) " +
            "FROM PubText t " +
            "JOIN t.comm c " +
            "WHERE c.element = ?1 " +
            "GROUP BY c.id");
    q.setParameter(1, e);
    List<?> rl = q.getResultList();
    Iterator<?> it = rl.iterator();
    HashMap<Long, Long> res = new HashMap<Long, Long>();
    while (it.hasNext()) {
        Object[] n = (Object[]) it.next();
        res.put((Long)n[0], (Long)n[1]);
    }
    return res;
Query q=em.createQuery(
选择c.id、计数(t.id)+
“来自PubText”+
“加入t.comm c”+
“其中c.element=?1”+
“按c.id分组”);
q、 设置参数(1,e);
List rl=q.getResultList();
迭代器it=rl.Iterator();
HashMap res=新的HashMap();
while(it.hasNext()){
对象[]n=(对象[])it.next();
res.put((长)n[0],(长)n[1]);
}
返回res;

JPA有一个专门用于此的功能-构造函数表达式:

Query q = entityManager.createQuery("SELECT NEW com.example.DTO( c.id, COUNT(t.id)) FROM ...");
List<DTO> dtos = q.getResultList();
Query q=entityManager.createQuery(“选择NEW com.example.DTO(c.id,COUNT(t.id))FROM…”);
List dtos=q.getResultList();

您的DTO类可以是POJO。它只需要一个接受2
Long
s的公共构造函数。请注意,您必须在
NEW
操作符之后提供您的类的完全限定名。

新代码现在看起来像这样。 谢谢你的帮助

    TypedQuery<CommUsed> q = em.createQuery(
        "SELECT new CommUsed(c.id,COUNT(t.id)) " +
        "FROM PubText t " +
        "JOIN t.comm c " +
        "WHERE c.element = ?1 " +
        "GROUP BY c.id", CommUsed.class);
    q.setParameter(1, e);
    HashMap<Long, Long> res = new HashMap<Long, Long>();
    for (CommUsed u : q.getResultList())
        res.put(u.commID, u.cnt);
TypedQuery q=em.createQuery(
“选择新的命令(c.id,计数(t.id))”+
“来自PubText”+
“加入t.comm c”+
“其中c.element=?1”+
“按c.id分组”,通用类);
q、 设置参数(1,e);
HashMap res=新的HashMap();
for(CommUsed u:q.getResultList())
res.put(联邦委员会、联邦政务总署);

我明白了,所以您毕竟可以使用typedquerys:)很高兴知道。不幸的是,似乎没有合理的方法从查询中直接填充
映射
,因此最后3行中的转换部分恐怕必须保留。啊,没问题。我们不需要像过去的C时代那样将所有内容都压成一行。:-)@HasanTuncay为什么不利用@kostja建议的构造函数表达式特性?我利用了。我刚刚添加了TypedQuery类型检查。hi@kostja我收到了一个错误(无法为具有多个返回的查询创建TypedQuery)。我的SQL如下所示:
从公司c中选择新的com.company.ui.EntityIDKey(c.companyId,c.name),其中c.companyId不为null,c.name不为null,长度(trim(c.name))>0按c.name排序asc
。我使用的TypedQuery如下:
List companys=getEntityManager().createQuery(sql,EntityIDKey.class).getResultList()如果EntityIDKey不是实体,则可能会出现这种情况。提供者可以不支持此类查询。您是否尝试过使用常规查询?没错,
EntityIDKey
不是实体。我正在使用Hibernate提供程序,不知怎么的,我认为它可以工作。构建
公司
集合的常规查询工作正常。只要您不从实体生成表(如有疑问,请检查persistence.xml),就可以使用“假”实体。然而,IMHO抑制类型警告是处理问题的一种直接(因此也是可以理解的)方法,而模拟实体更像是一种解决方法。如果作为后来的维护人员,我看到一个实体没有相应的表,那么我需要一些时间才能弄清楚它的用途。@kostja:因为DTO可能不是一个实体,所以不能使用TypedQuery。这是不对的。因此,JSR-317中的构造函数表达式明确指出:“可以在选择列表中使用构造函数来返回Java类的实例。指定的类不需要是实体或映射到数据库。构造函数名称必须是完全限定的。”