JPQL是否支持以下更新? Update Person p set p.name = :name_1 where p.id = :id_1, p.name = :name_2 where p.id = :id_2, p.name = :name_3 where p.id = :id_3 如果没有,还有其他选择吗? 我自己尝试了.但是createQuery返回null. 解决方案 案例表达在JPA 2.0中支持.我提供了伪代码,可以进行相应的修改. 您可以使用CASE. Update Person p set p.name = CASE WHEN (p.id = :id1) THEN :name_1 WHEN (p.id = :id2) THEN :name_2 WHEN (p.id = :id3) THEN :name_3 END general_case_expression
以下是关于 jpql 的编程技术问答
我发现JPA不支持以下更新: Update Person p set p.name = :name_1 where p.id = :id_1, p.name = :name_2 where p.id = :id_2, p.name = :name_3 where p.id = :id_3 .... // It could go on, depending on the size of the input. Could be in 100s 所以我有两个选择: 选项1: Query q = em.createQuery("Update Person p set p.name = :name where p.id = :id"); For ( int x=0; PersonsList.length; x++ ) {
我正在使用Eclipse Indigo,并且有" JPA验证问题". 我的命名查询是: from Person p where p.name = :name 有一个错误: The query does not start with a valid identifier, has to be either SELECT, UPDATE or DELETE FROM. ,但这是有效的JPQL查询.有人知道我如何删除此错误? 如果我将查询更改为 select p from Person p where p.name = :name 没有更多的错误,但是我不想更改我的所有查询. 谢谢 mp5 解决方案 在我看来,它看起来像任何形式的查询: from Person p where p.name = :name 实际上不是有效的JPQL.根据语言参考: http://docs.oracle.com/javaee/5/5/教
可以在JPQL中写和调用用户定义的函数? 解决方案 JPA规范本身不支持它,但是,某些JPA实现可能会提供此类扩展. 例如,在Hibernate中您可以子类a 其他解决方案 可以在JPQL中写和调用用户定义的函数? 简短答案 - 否. 长答案是,在JPQL查询中无法引用本机函数,即JPQL作为一个非常定义的语法.例如,JPQL查询的选择子句使用BNF符号在JPA规范中定义为: select_clause :: = select [distract] select_item {,select_item}* select_item :: = select_expression [[AS] result_variable] select_expression :: = single_valued_path_path_expression | scalar_expression | gentregate_expression | dissid
在每个DB查找方法上都有TransactionAttributeType.NOT_SUPPORTED是否有意义?如果实体不执行更新,我看不到附加的重点. @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) pubic List getListEntities(){ TypedQuery query = em.createNamedQuery("AnEntity.myQuery",AnEntity.class); return query.getResultList(); } 它仍然在缓存中? 使用REQUIRED travercation传播似乎唯一有用的是需要更新时: @TransactionAttribute(TransactionAttributeType.REQUIRED) public void editPersonName(
尝试运行此代码时会遇到此错误. 错误: javax.persistence.transactionRequiredException:通过非传输访问获得容器管理的Transactional EntityManager 获得的查询对象不支持ExecuteUpDate 代码:(_UT是一个用户transaction对象) public void setMainCategory(Integer Deptid,Integer Catid){ try { Query setmain = _entityManager.createNamedQuery("Category.setAsMain"); Query removeMain = _entityManager.createNamedQuery("Category.removeMain"); setmain.setParameter(
一切都很好,直到我在实体课程中添加toSting(). 之后,我开始在运行时遇到以下错误: Exception in thread "main" java.lang.StackOverflowError at java.lang.AbstractStringBuilder.append(Unknown Source) at java.lang.StringBuilder.append(Unknown Source) at java.lang.StringBuilder.(Unknown Source) at entity.Guide.toString(Guide.java:51) at java.lang.String.valueOf(Unknown Source) at java.lang.StringBuilder.append(Unknown Source) at entity.Student.toSt
我想使用当前日期函数在JPQL查询中比较两个日期 我有一个错误 语法错误解析[从档案d中选择D d d.depid = 1 and d.typedossier =:tpd and d.datecreation [105,107]左表达不是算术表达 这是我的查询: public List getDossierFindAllParDepartementDBTECHandUrgen() { return (List) em.createQuery("SELECT d FROM Dossier d WHERE d.depid=1 AND d.typeDossier = :tpd AND " + "d.dateCreation
我需要使用Apache OpenJPA 2在Select子句中执行子查询. JPA是否支持Select子句中的子征? 我的查询就是这样: SELECT t.date, t.value, (SELECT COUNT(DISTINCT t2.value2) FROM table t2 WHERE t2.date = t.date) FROM table t WHERE ... 当我执行查询时,我会得到一个类铸造异常: Exception in thread "main" org.apache.openjpa.persistence.ArgumentException: at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:872) at org.apache
我试图通过加入子查询来获得平均值的集体比.不知道这是正确的方法,但是除了MySema Doc. 方案: 每个产品平均每种产品订单多少? 含义:客户订购产品.因此,客户订购了多次特定产品(计数).客户为任何产品下达的订单平均数量是多少? 听起来可能有点假设,实际上它只是原型的一部分,但这让我想知道,如何获得来自MySema的fancy querydsl在子查询中创建的自定义列的引用. . 在SQL中,您只需给计数列一个别名,然后使用第二个ID列加入即可. queryDSL也具有" AS()"方法,但我不知道,如何检索该列加上我看不到它如何与Anotherts一起加入一个查询,因为query.list()只是获取列表,但对于某些列表加入的原因接受.感觉错了... 这是我的代码: JPQLQuery query = createJPQLQuery(); QOrdering qOrdering = QOrdering.ordering; QP
我正在使用EJB和容器管理的EM(用于本地测试,我在这里创建EM). 我需要根据某种条件更新数据库的要求,我的问题是更新时间,如何减少它? 我尝试了两种方法 1>更新查询 2>更新实体 请让我知道我是否在犯任何错误或其他任何方法. 注意:更新的代码如下 public class Test { private static final int OaOnaccount = 0; private static final int ArrayList = 0; private static EntityManagerFactory emf; private static EntityManager em; static int TEST_SIZE = 20000/4; public static void main(String[] args) { // createBulk(); cr
我试图用子句用订单编写jpql查询: query = "SELECT c FROM item ORDER BY c.name ASC" 我想设置一个"顺序"参数,其值为" asc"或" desc": query = "SELECT c FROM item ORDER BY c.name :order" ,然后在我的实施中: query.setParameter("order", "ASC"); 这是我遇到冬眠错误的时候: org.hibernate.HibernateException: Errors in named queries 对我做错了什么的想法?谢谢! 解决方案 " ASC"或" DESC"不能是查询参数.您可以使用字符串串联. query = "SELECT c FROM item ORDER BY c.name " + sortOrder; 您应该验证sortOrder的内容只能是ASC或DESC,而不是直接来自用
我想使用Entity Manager创建功能在数据库中搜索所请求的值.每当我执行方法时,我都会收到以下错误消息: llegalargumentException:您尝试设置类型类Java.lang.String的参数searchValue的值,并从Query String 设置INT的预期类型 它说需要一个int值,但是我认为每个类似的表达式都需要一个字符串值? 实体: public class Contract implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id") private Integer id; @
我有以下jpql查询: SELECT il FROM InsiderList il WHERE ( il.deleteFlag IS NULL OR il.deleteFlag = '0' ) AND il.clientId = :clientId AND ( LOWER( il.name ) LIKE :searchTerm OR il.nbr LIKE :searchTerm OR LOWER( il.type ) LIKE :searchTerm OR LOWER( il.description ) LIKE :searchTerm ) 客户希望我们能够搜索为nbr字段,即java.lang.Long. q : 如何使用JPQL上的A java.lang.Long进行类似的搜索? 解决方案 您可以在HQL中使用CAST: SELECT il FROM InsiderList il WH
我试图用类似子句编写jpql查询: LIKE '%:code%' 我想拥有代码= 4并找到 455 554 646 ... 我不能通过:code = '%value%' namedQuery.setParameter("%" + this.value + "%"); 因为在另一个地方,我需要:value % chars不包裹.有帮助吗? 解决方案 如果您做 LIKE :code 然后做 namedQuery.setParameter("code", "%" + this.value + "%"); 然后,值仍然没有"%"符号.如果您需要在同一查询中的其他地方使用它,只需使用"代码"以外的其他参数名称. 其他解决方案 我不使用所有查询的命名参数. For example it is unusual to use named parameters in jparepository . 进行解决方案,我使用JPQL con
i被告知,在查询下面的查询不安全,因为参数:searchfor 来自前端输入字段的seleffore 可用于SQL注入. PLASE建议在以下代码中防止SQL注入的最佳解决方案是什么? @Query("SELECT u FROM User u WHERE lower(u.username) LIKE %:searchFor% " + " OR lower(concat(u.firstname, ' ', u.lastname)) LIKE %:searchFor% " + " OR lower(u.email) LIKE %:searchFor%") Page findAllAndSearch(@Param(value = "searchFor") String searchFor, Pageable pageable); 我不使用"+"来加入字符串,而是提供参数(:searchfor).不确定这是否仍然不安全. 解决方案
我使用Java EE 6和JSF-2.0构建Java Web应用程序,使用持久性API用于所有数据库操作. 后端是mySQL,但是我使用了EntityManager函数,并在EJB-ql中命名了所有操作中的查询.在这种情况下,SQL注射攻击是否可能? 解决方案 仅当您在SQL/JPQL字符串中插入用户控制变量时,才有可能: String sql = "SELECT u FROM User u WHERE id=" + id; 如果您不这样做并且仅使用参数化/命名查询,那么您是安全的. 其他解决方案 是的,这是可能的.这取决于您实施的方式. 看看防止在JPA查询语言中注入. 其他解决方案 如果您的JPA提供商处理所有输入参数以处理注射攻击,则应涵盖您.我们在eclipselink中做得很薄. 正如先前提到的海报将您自己的JPQL或SQL(用于本地查询)拼凑在一起的情况可能会使您曝光. 我建议使用串联字符串上的参数使用命名的查询来构建JP
用limit getList form offset我可以使用: @Override public List getList(int offset, int limit) { String SELECT_COLLECTIONS = "select collection from " + Collection.class.getName() + " collection"; TypedQuery query = entityManager.createQuery(SELECT_COLLECTIONS, Collection.class); return query.setFirstResult(offset).setMaxResults(limit).getResultList(); } 现在,我有一些实体的主键,而不是偏移.
我有一个实体: @Entity(name = "target_group") public class TargetGroup extends AbstractEntity { private String name; private String description; @ManyToMany(fetch = FetchType.LAZY) private List customers = new ArrayList(); getter.setter... } 我有一个代码,以获取有关stableId组的列表(在抽象类中): public TargetGroup getTargetGroupByStableId(String stableId) { TargetGroup tg = null; try { Query q = em.createQuery("SELECT t