以上就是给各位分享JPQL:SELECTNEW查询中的Enum文字,其中也会对查询语句select进行解释,同时本文还将给你拓展ajax–a4j:support–从h检索的值:selectOneMen
以上就是给各位分享JPQL:SELECT NEW查询中的Enum文字,其中也会对查询语句select进行解释,同时本文还将给你拓展ajax – a4j:support – 从h检索的值:selectOneMenu始终为NULL、h:selectOneMenu中的f:ajax侦听器方法未执行、JPA JPQL:使用COUNT,GROUP BY和ORDER BY选择SELECT NEW、jpa – JPQL查询SELECT可选通用DAO选择等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:- JPQL:SELECT NEW查询中的Enum文字(查询语句select)
- ajax – a4j:support – 从h检索的值:selectOneMenu始终为NULL
- h:selectOneMenu中的f:ajax侦听器方法未执行
- JPA JPQL:使用COUNT,GROUP BY和ORDER BY选择SELECT NEW
- jpa – JPQL查询SELECT可选通用DAO选择
JPQL:SELECT NEW查询中的Enum文字(查询语句select)
我有几个域类的描述符类。描述符类具有一个字段“
type”,该字段是一个枚举并指示域类的类型。在某些查询中,我想返回一个或多个描述符,并将类型作为构造函数参数传递。所以我的想法是将其作为查询参数传递:
String jpql = "SELECT NEW model.ModelDescriptor" + "(t.id, t.name, t.description, :modelType) ... "; TypedQuery<ModelDescriptor> query = em.createQuery(jpql, ModelDescriptor.class); query.setParameter("modelType", ModelType.forClass(clazz)); List<ModelDescriptor> list = query.getResultList();
这是行不通的。没有引发异常,但null
结果中包含类型。另外,也无法将枚举文字传递给查询:
"SELECT NEW model.ModelDescriptor (f.id, f.name, f.description, model.ModelType.FLOW) ... "
编辑 我得到以下堆栈跟踪:
java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: Exception Description: Error compiling the query [SELECT model.ModelDescriptor(f.id, f.name, f.description, model.ModelType.FLOW) FROM Flow f WHERE flow.id = :flowId], line 1, column 78: unknown identification variable [model]. The FROM clause of the query does not declare an identification variable [model]. at org.eclipse.persistence.internal.jpa.EntityManagerImpl. createQuery(EntityManagerImpl.java:1477) at org.eclipse.persistence.internal.jpa.EntityManagerImpl. createQuery(EntityManagerImpl.java:1497)
我使用EclipseLink作为持久性框架。
有没有办法将枚举文字传递给SELECT NEW表达式?
答案1
小编典典不,没有,通常没有任何方法可以引用任何类中的字段,并且也无法将参数传递给SELECT子句。只有构造函数表达式的有效参数是(来自JPA
2.0规范,第174页)
- single_valued_path_expression
- 标量表达式
- 聚合表达式
- Identification_variable
ajax – a4j:support – 从h检索的值:selectOneMenu始终为NULL
DataTable标头:
<t:dataTable id="datatable" var="row" value="#{myBean.dataTableRows}">
SelectOneMenu with A4j:
<h:selectOneMenu id="type" label="Type:" stylevalue="#{datatableHolder.selectedValue}" converter="comboConverter" immediate="true" > <f:selectItem itemValue="#{null}" itemLabel="" /> <t:selectItems var="tp" itemValue="#{tp}" itemLabel="#{tp.nome}" value="#{row.comboTypeValues}" /> <f:attribute name="row" value="#{row}"/> <a4j:support event="onchange" reRender="parent" actionListener="${myBean.executeAjax}" immediate="true" ajaxSingle="true" /> </h:selectOneMenu>
要执行的backing Bean方法:
public void executeAjax(ActionEvent event){ ValueHolder comboBox = (ValueHolder) event.getComponent().getParent(); comboBox .getValue(); }
> comboBox .getValue()返回NULL,即使我选择了一个值.
PS:
这个问题已被确定为this question的可能重复,但事实并非如此.我的问题使用dataTable并且不对每个元素使用绑定.另外,我使用的是JSF 1.1和RichFaces 3.3.3.
解决方法
由t:selectItems标记生成的每个“选项”都使用项目ID而不是索引,而comboConverter使用索引来选择项目.因此,列表有12个项目(索引的范围应为0到11),但所选项目的ID为22.然后转换器将遍历列表到索引22并检索该元素.但是这个列表中没有这样的索引,因为最大值是12,然后转换器将始终返回NULL.
对于这个问题,基本上有3种方法可以解决:
>创建一个新的转换器,通过它的id查找该项目
>调整/更改“comboConverter”以通过它的id查找项目(这样做会影响使用此转换器的其他代码段
>调整列表以使用索引而不是ID
由于系统中的轻微影响,我选择了第一个.
h:selectOneMenu中的f:ajax侦听器方法未执行
在托管bean中使用适当的值正确生成了页面,但是这两个h:selectOneMenus中的ajax事件不起作用。不调用侦听器。标签内一定有错误,但我看不到。
<f:view>
<h:form>
<h:messages />
<h:panelGrid columns="3">
<h:outputLabel value="Choose your faculty: *" for="faculties" />
<h:selectOneMenu id="faculties" value="#{registrateStudent.selectedFaculty}" >
<f:ajax event="change" listener="#{registrateStudent.genSpecializations}" execute="faculties" render="specializations" />
<f:selectItems value="#{registrateStudent.listFaculty}" var="curFac" itemLabel="#{curFac.name}" itemValue="#{curFac}" />
</h:selectOneMenu>
<h:message id="message_faculties" for="faculties" />
<h:outputLabel value="Choose your specialization: *" for="specializations" />
<h:selectOneMenu id="specializations" value="#{registrateStudent.selectedSpecialization}" >
<f:selectItems value="#{registrateStudent.listSpecialization}" var="curSpec" itemLabel="#{curSpec.name}" itemValue="#{curSpec}"/>
</h:selectOneMenu>
<h:message id="message_specializations" for="specializations" />
托管Bean:
@ManagedBean(name = "registrateStudent")
@ViewScoped
public class RegistrateStudent {
private Faculty selectedFaculty;
private List<Faculty> listFaculty;
private Specialization selectedSpecialization;
private List<Specialization> listSpecialization;
private boolean showSpecialization = false;
/** Creates a new instance of RegistrateStudent */
public RegistrateStudent() {
users = new Users();
System.out.println("poaposd1");
student = new Student();
}
@PostConstruct
public void init() {
listFaculty = ff.findAll();
if (listFaculty != null) {
selectedFaculty = listFaculty.get(0);
listSpecialization = sf.findByFaculty(selectedFaculty.getIdFaculty());
if (listSpecialization != null) {
selectedSpecialization = listSpecialization.get(0);
}
else {}
} else {}
}
public void genSpecializations(AjaxBehaviorEvent event) {
if (sf.findByFaculty(selectedFaculty.getIdFaculty()) != null) {
this.showSpecialization = true;
} else {
JsfUtil.addSuccessMessage("faculties","We don't have specializations for such faculty");
}
}
}
更新:
我发现了一些有趣的东西:
<f:ajax>
标签不工作<h:link>
,<h:selectOneMenu>
,<h:button>
,<h:commandButton>
。在这种情况下,render
不会注意到event
属性中的错误值,但是属性的错误值会产生错误。
<h:outputLabel>
,<h:inputText>
可以<f:ajax>
正常使用
JPA JPQL:使用COUNT,GROUP BY和ORDER BY选择SELECT NEW
有2个表/实体:AppleTree
和Apples
。一棵苹果树产生0 …
n个苹果。每个苹果都是第二个表的实体/行,并引用产生它的苹果树(ManyToOne
)。
我想针对生产力最高的苹果树生成“高分”报告。它应按COUNT列降序排列:
APPLE TREE | COUNT(A)
---------------------
10304 | 1000
72020 | 952
31167 | 800
为了处理这些结果,我创建了一个非实体Bean,它结合了AppleTree对象和一个长值(对于COUNT):
// constructor
public AppleStats (AppleTree at,long howManyApples) { ... }
我想使用JPQL来获取此组合类型的行。我的方法基于以下SELECT NEW
语法:
SELECT NEW foo.bar.AppleStats ( a.appleTree,COUNT(a) AS c )
FROM Apples a
GROUP BY a.appleTree
ORDER BY c DESC
不幸的是,它会产生很多错误消息。我认为一个问题是COUNT值的列别名。我使用它,因为我想按此汇总值排序。我使用“ COUNT(a)AS c”还是“
COUNT(a)c”都没有区别。它说,论点没有用逗号分开。此外, “表达式无效,这表示它不遵循JPQL语法” 。最后,它说
找不到与参数类型匹配的构造函数。”
有没有办法获取我的AppleStats结果行?还是我必须回归本机查询?
jpa – JPQL查询SELECT可选通用DAO选择
return (ArrayList<Category>) getEntityManager().createquery("from Category").getResultList();
查询非常简写 – 我无法找到任何指南中的可选和不可用的规则.这简洁可以接受吗?
其次,我想在一个通用的DAO中实现它,例如:
public interface DAO<E,K> { List<E> getAll(); }
如何重写第一个查询以适用于所有类型,因为我无法硬编码“从类别”..?
解决方法
>您必须添加一个Class< E> DAO的参数:
public List<E> getAll(Class<E> entityClass) { Query query = enittyManager.createquery("from " + entityClass.getName()); query.getResultList(); }
关于JPQL:SELECT NEW查询中的Enum文字和查询语句select的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于ajax – a4j:support – 从h检索的值:selectOneMenu始终为NULL、h:selectOneMenu中的f:ajax侦听器方法未执行、JPA JPQL:使用COUNT,GROUP BY和ORDER BY选择SELECT NEW、jpa – JPQL查询SELECT可选通用DAO选择等相关内容,可以在本站寻找。
本文标签: