如何为CollectionOfElements创建自定义查询 [英] How to create custom query for CollectionOfElements

查看:76
本文介绍了如何为CollectionOfElements创建自定义查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在创建自定义查询时遇到了问题。



这是实体:

  @Entity 
public class ApplicationProcess {

@CollectionOfElements
private Set< Template> defaultTemplates;
//更多字段
}

和Template.java

  @Embeddable 
@EqualsAndHashCode(exclude = {used})
public class Template implements< Template> {

@Setter私人ApplicationProcess applicationProcess;
@Setter private Boolean used = Boolean.valueOf(false);

public Template(){
}

@Parent
public ApplicationProcess getApplicationProcess(){
return applicationProcess;


@Column(nullable = false)
@NotNull
public String getName(){
return name;


@Column(nullable = true)
public Boolean isUsed(){
return used;
}

public int compareTo(Template o){
return getName()。compareTo(o.getName());
}
}

我想创建一个更新语句。我尝试了这两个:
$ b $ pre $ int v = entityManager.createQuery(update ApplicationProcess_defaultTemplates t set t.used = true+ WHERE t.applicationProcess.id =:apId)。setParameter(apId,ap.getId())
.executeUpdate();

ApplicationProcess_defaultTemplates未映射[update ApplicationProcess_defaultTemplates t set t.used = true WHERE t.applicationProcess.id =:apId]



我已经尝试了

  int v = entityManager.createQuery(update Template t set t.used = true+WHERE t.applicationProcess.id =:apId)。setParameter(apId,ap.getId ())
.executeUpdate();

同样的错误:

模板未映射[update template t set t.used = true WHERE t.applicationProcess.id =:apId]



任何想法?



更新
$ b 我通过创建本地查询

  INT v = entityManager.createNativeQuery( 更新ApplicationProcess_defaultTemplates t.used =真吨组其中t.ApplicationProcess_id =:APID)。 setParameter(apId,ap.getId())。executeUpdate(); 


解决方案

由于嵌入式对象不是实体,它们不能出现在hql查询的from子句中。为了更新这个对象,你需要将它放在from子句中。

所以你有两种可能性:


  • 使用sql查询(注意了解sql update对当前会话实体的影响(缺少))

  • 重构模板类到实体


I have problems creating a custom query.

This is what entities:

@Entity
public class ApplicationProcess {

    @CollectionOfElements
    private Set<Template> defaultTemplates;
    //more fields
}

And Template.java

@Embeddable
@EqualsAndHashCode(exclude={"used"})
public class Template implements Comparable<Template> {

 @Setter private ApplicationProcess applicationProcess;
 @Setter private Boolean used = Boolean.valueOf(false);

 public Template() {
 }

 @Parent
 public ApplicationProcess getApplicationProcess() {
   return applicationProcess;
 }

 @Column(nullable = false)
 @NotNull
 public String getName() {
   return name;
 }

 @Column(nullable = true)
 public Boolean isUsed() {
   return used;
 }

 public int compareTo(Template o) {
   return getName().compareTo(o.getName());
 }
}

I want to create a update statement. I have tried these two:

int v = entityManager.createQuery("update ApplicationProcess_defaultTemplates t set t.used = true " + "WHERE t.applicationProcess.id=:apId").setParameter("apId", ap.getId())
   .executeUpdate();

ApplicationProcess_defaultTemplates is not mapped [update ApplicationProcess_defaultTemplates t set t.used = true WHERE t.applicationProcess.id=:apId]

And I have tried

 int v = entityManager.createQuery("update Template t set t.used = true " + "WHERE t.applicationProcess.id=:apId").setParameter("apId", ap.getId())
   .executeUpdate();

With the same error:

Template is not mapped [update Template t set t.used = true WHERE t.applicationProcess.id=:apId]

Any ideas?

UPDATE

I fixed it by creating native query

int v = entityManager.createNativeQuery("update ApplicationProcess_defaultTemplates t set t.used=true where t.ApplicationProcess_id=:apId").setParameter("apId", ap.getId()).executeUpdate();

解决方案

What you want to do is not possible in hql : as embedded objects are not entities, they cannot appear in the from clause of hql queries. And to do an update of that object you need it to be in the from clause.

So you have two possibilities :

  • Either use a sql query (be careful to know the (lack of) impact of sql update on the current session entities)
  • refactor your Template class to an entity

这篇关于如何为CollectionOfElements创建自定义查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆