如何为CollectionOfElements创建自定义查询 [英] How to create custom query for 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屋!