JPA – Querydsl投影

在我的上一篇文章中: JPA –基本投影 –我已经提到了构建JPA投影的两种基本可能性。 这篇文章为您带来了更多示例,这次基于Querydsl框架。 注意,这里我指的是Querydsl版本3.1.1。

重塑构造函数表达式

看下面的代码:

...
import static com.blogspot.vardlokkur.domain.QEmployee.employee;import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;import org.springframework.beans.factory.annotation.Autowired;import com.blogspot.vardlokkur.domain.EmployeeNameProjection;import com.mysema.query.jpa.JPQLTemplates;
import com.mysema.query.jpa.impl.JPAQuery;
import com.mysema.query.types.ConstructorExpression;
...public class ConstructorExpressionExample {...@PersistenceContextprivate EntityManager entityManager;@Autowiredprivate JPQLTemplates jpqlTemplates;public void someMethod() {...final List<EmployeeNameProjection> projections = new JPAQuery(entityManager, jpqlTemplates).from(employee).orderBy(employee.name.asc()).list(ConstructorExpression.create(EmployeeNameProjection.class, employee.employeeId,employee.name));...                                }...
}

上面的Querydsl构造意味着:使用employee作为数据源创建新的JPQL查询[1] [2] ,使用employee名称[3]排序数据,并返回EmployeeNameProjection的列表,该列表是使用名为的2-arg构造函数构建的员工编号和姓名[4] 。 这与我之前的文章( JPA – Basic Projections )中的构造函数表达式示例非常相似,并导致以下SQL查询:

>select EMPLOYEE_ID, EMPLOYEE_NAME from EMPLOYEE order by EMPLOYEE_NAME asc

如上所示,与JPA构造函数表达式相比,主要优点是使用Java类,而不是在JPQL查询中进行硬编码的名称。

更重塑的构造函数表达式

Querydsl文档[4]描述了使用构造函数表达式的另一种方式,要求使用@QueryProjection批注和Query Type [1]进行投影,请参见下面的示例。 让我们从修改投影类开始-请注意,我在类构造函数上添加了@QueryProjection批注。

package com.blogspot.vardlokkur.domain;import java.io.Serializable;import javax.annotation.concurrent.Immutable;import com.mysema.query.annotations.QueryProjection;@Immutable
public class EmployeeNameProjection implements Serializable {private final Long employeeId;private final String name;@QueryProjectionpublic EmployeeNameProjection(Long employeeId, String name) {super();this.employeeId = employeeId;this.name = name;}public Long getEmployeeId() {return employeeId;}public String getName() {return name;}}

现在,我们可以按以下方式使用修改后的投影类(和相应的Query Type [1] ):

...
import static com.blogspot.vardlokkur.domain.QEmployee.employee;import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;import org.springframework.beans.factory.annotation.Autowired;import com.blogspot.vardlokkur.domain.EmployeeNameProjection;
import com.blogspot.vardlokkur.domain.QEmployeeNameProjection;import com.mysema.query.jpa.JPQLTemplates;
import com.mysema.query.jpa.impl.JPAQuery;...public class ConstructorExpressionExample {...@PersistenceContextprivate EntityManager entityManager;@Autowiredprivate JPQLTemplates jpqlTemplates;public void someMethod() {...final List<EmployeeNameProjection> projections = new JPAQuery(entityManager, jpqlTemplates).from(employee).orderBy(employee.name.asc()).list(new QEmployeeNameProjection(employee.employeeId, employee.name));...}...
}

这导致SQL查询:

select EMPLOYEE_ID, EMPLOYEE_NAME from EMPLOYEE order by EMPLOYEE_NAME asc

实际上,当您仔细查看为EmployeeNameProjectionQEmployeeNameProjection )生成的查询类型[1]时 ,您会发现这是一种用于创建构造函数表达式的“捷径”,如本文第一部分所述。

映射投影

Querydsl使用基于MappingProjection的工厂提供了另一种构建投影的方法。

package com.blogspot.vardlokkur.domain;import static com.blogspot.vardlokkur.domain.QEmployee.employee;import com.mysema.query.Tuple;
import com.mysema.query.types.MappingProjection;public class EmployeeNameProjectionFactory extends MappingProjection<EmployeeNameProjection> {public EmployeeNameProjectionFactory() {super(EmployeeNameProjection.class, employee.employeeId, employee.name);}@Overrideprotected EmployeeNameProjection map(Tuple row) {return new EmployeeNameProjection(row.get(employee.employeeId), row.get(employee.name));}}

上面的类是一个简单的工厂,它使用员工ID和名称创建EmployeeNameProjection实例。 请注意,工厂构造函数定义了将使用哪些员工属性来构建投影,而map方法定义了如何创建实例。

您可以在下面找到使用工厂的示例:

...
import static com.blogspot.vardlokkur.domain.QEmployee.employee;import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;import org.springframework.beans.factory.annotation.Autowired;import com.blogspot.vardlokkur.domain.EmployeeNameProjection;
import com.blogspot.vardlokkur.domain.EmployeeNameProjectionFactoryimport com.mysema.query.jpa.JPQLTemplates;
import com.mysema.query.jpa.impl.JPAQuery;
...public class MappingProjectionExample {...@PersistenceContextprivate EntityManager entityManager;@Autowiredprivate JPQLTemplates jpqlTemplates;public void someMethod() {...final List<EmployeeNameProjection> projections = new JPAQuery(entityManager, jpqlTemplates).from(employee).orderBy(employee.name.asc()).list(new EmployeeNameProjectionFactory());....}...
}

如您所见,与构造函数表达式示例相比,此处唯一的区别是列表方法调用。

上面的示例再次导致非常简单的SQL查询:

select EMPLOYEE_ID, EMPLOYEE_NAME from EMPLOYEE order by EMPLOYEE_NAME asc

这种方式构建投影功能更加强大,并且不需要存在n-arg投影构造函数。

基于QBean的投影(JavaBeans再次出现)

使用基于QBean的 Querydsl创建投影至少还有另一种可能性,在这种情况下,我们使用以下方法构建结果列表:

... .list(Projections.bean(EmployeeNameProjection.class, employee.employeeId, employee.name))

这种方式要求EmployeeNameProjection类遵循JavaBean约定,这在应用程序中并不总是需要的。 如果需要,请使用它,但已被警告

很少有甜点链接

  1. 使用查询类型
  2. 查询方式
  3. 定购
  4. 建设者预测

参考: JPA –我们的JCG合作伙伴 Michal Jastak在Warlock's Thoughts博客上的Querydsl预测 。

翻译自: https://www.javacodegeeks.com/2013/05/jpa-querydsl-projections.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3n+1问题中的几个小的注意点

3038 3n1问题 时间限制: 1 s空间限制: 32000 KB题目等级 : 白银 Silver题解题目描述 Description3n1问题是一个简单有趣而又没有解决的数学问题。这个问题是由L. Collatz在1937年提出的。克拉兹问题&#xff08;Collatz problem&#xff09;也被叫做hailstone问题、3n1问题、Ha…

Mysql函数访问oracle,Oracle与MySql函数

Oracle:1. 截取字符串中字符前的字符串(不包括字符)select Substr(P.SCHEDULE_CODE, 1, Instr(P.SCHEDULE_CODE, (, 1)-1) from M_SUB_TASK_SCHEDULE_LOG P;2. 截取字符串中字符前的字符串(包括字符)select Substr(P.SCHEDULE_CODE, 1, Instr(P.SCHEDULE_CODE, (ret, 1)) fr…

html 语义化标签拾遗

1、del和ins标签 兼容性&#xff1a;浏览器全部支持 del&#xff1a;定义文档中已被删除的文本。 ins&#xff1a;定义已经被插入文档中的文本。 <!DOCTYPE html><html lang"zh"><head><meta charset"UTF-8" /><title>ht…

Spring MVC表单教程

本教程将展示如何在Spring MVC中处理表单提交。 我们将定义一个控制器来处理页面加载和表单提交。 您可以在GitHub上获取代码。 先决条件&#xff1a; 您应该有一个运行中的Spring MVC应用程序。 如果尚未设置正常的Spring MVC应用程序&#xff0c;请按照本教程进行操作 。 对…

一个跳转提示页面---JS

//一个跳转提示页面 <script type"text/javascript"> var s5; function go(){ document.getElementById("chan").innerHTMLs; ss-1; if (s0){ window.location.href"http://www.imooc.com/"; …

理解Flexbox弹性盒子

http://www.w3cplus.com/css3/understanding-flexbox-everything-you-need-to-know.html参考文档 1&#xff1a;要开始使用Flexbox&#xff0c;必须先让父元素变成一个Flex容器。 你可以在父元素中显式的设置 display:flex或者 display:inline-flex。就这么的简单&#xff0c…

php安装dat,PHP Parsing a .dat file

问题I have a .dat file that is essentially ; delimited file and Im trying to convert it to a tab delimited .txt. The problem that I am not sure about is that each row of the new file will be a combination of 3 of the original files rows, each original row …

[转]Bing Maps Tile System 学习

原文链接&#xff1a;Bing Maps Tile System 学习 转载于:https://www.cnblogs.com/rainbow70626/p/8992322.html

Spring休眠3

1.概述 本文将重点介绍通过Spring设置Hibernate 3 –我们将研究如何同时使用XML和Java配置通过Hibernate 3和MySQL设置Spring 3。 2. Hibernate 3的Java Spring配置 使用Spring和Java配置来设置Hibernate 3很简单&#xff1a; import java.util.Properties; import javax.sql…

我们十组的cantool装置的使用

十组的cantool装置的使用 下图是连接好的示意图&#xff0c;灯亮。 如果在串口关闭的时候输入C&#xff0c;cantool装置就会报错&#xff0c;因为串口是关闭的。正如需求文档里写的&#xff0c;当串口关闭&#xff0c;输入C要有返回\BEL的,关闭串口的前提是串口打开。 正确发送…

php查询功能突然没有用,php – 为什么搜索查询没有在PHRETS中显示任何结果?

我正在使用这个PHP脚本从一个简单的搜索查询获得结果here我已经下载了属性here的元数据excel文件$rets_login_url "http://sef.rets.interealty.com/Login.asmx/Login";$rets_username "xxxxxxxx";$rets_password "xxxxxxxx";$rets_user_agen…

es6入门

现在我们来学习一下es6,它现在是一门比较火的语言但是并不是所有的浏览器都兼容E6说的全部特性&#xff0c; 但是我们依旧应该学习一下ES6的语法。 因为兼容性我们得学习一下Babel,它是一个广泛使用的ES6转换器&#xff0c;可以将ES6代码转化为ES5代码&#xff0c;从而在现有环…

2018-05-05(在小程序中使用图标)

项目中常常需要使用到字体图标&#xff0c;微信小程序中使用字体图标与在平常的web前端中类似但是又有区别。下面以使用阿里图标为例子讲解如何在微信小程序中使用字体图标。 第一步&#xff1a;下载需要的字体图标 进入阿里图标官网http://iconfont.cn/搜索自己想要的图标&…

Spring休眠4

1.概述 本文将重点介绍如何使用Spring设置Hibernate 4 –我们将研究如何使用Java和XML配置来使用Hibernate 4配置Spring 3。 当然&#xff0c;该过程的某些部分对于Hibernate 3文章是通用的 。 2. Maven 要将Spring Persistence依赖项添加到项目pom.xml中 &#xff0c;请参阅专…

php 水平测试,测试您的 PHP 水平的题目_PHP教程

在 Unix Review 上看到这个很有意思的测试&#xff0c;和大家共享。UnixReview.comMay 2007Test Your Knowledge of PHPby Emmett DulaneyFrom: http://www.unixreview.com/documents/s10130/ur0705d/Increasingly, PHP seems to be the tool/language that is used to make We…

Django的模板系统

一、模板的组成 html代码和逻辑控制代码 二、逻辑控制代码的形式 1、变量&#xff08;使用双大括号引用变量&#xff09; a、template和context 语法 : {{ var_name }} 模板系统不仅可以传字符串&#xff0c;它可以传递任意对象&#xff0c;对于向列表、字典、元组等对象&…

Java SE 7 Update 25 –发行说明进行了解释。

昨天是CPU日。 Oracle通过6月的Java重要补丁更新发布了Java SE更新25 。 在4月的最后一次重大更新之后&#xff0c;这是与所有其他Oracle产品一起不符合Oracle关键补丁更新计划的最后一个更新。 从2013年10月开始 &#xff0c;Java安全修补程序将遵循四个年度安全发布周期。 但…

springmvc mybatis 做分页sql 语句

<?xml version"1.0" encoding"UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace"ssmy.dao.UserDao"> <res…

LeetCode Subarray Product Less Than K

原题链接在这里&#xff1a;https://leetcode.com/problems/subarray-product-less-than-k/description/ 题目&#xff1a; Your are given an array of positive integers nums. Count and print the number of (contiguous) subarrays where the product of all the elements…

Ansible: hosts文件拆分为inventory和定义inventory全局变量

前言 随着管理机器的增多&#xff0c;我们在使用Ansible的时候时常会遇到hosts文件过于冗长的问题&#xff0c;极其不便于管理&#xff0c;而将hosts文件拆分为inventory就可解决该问题&#xff1b;另外&#xff0c;hosts中的每个主机条目需要指定用户名和私钥或密码&#xff0…