日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

终极JPA查询和技巧列表–第1部分

發布時間:2023/12/3 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 终极JPA查询和技巧列表–第1部分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我們可以在Internet上找到一些JPA“如何做”,在本博客的此處,教您如何使用JPA執行多項任務。

通常,我看到有人問有關使用JPA進行查詢的問題。 通常,為了回答此類問題,提供了幾個鏈接,以嘗試找到該問題的解決方案。

直到今天,我仍無法找到一篇博客文章,其中匯集了有關使用JPA進行查詢的良好主題,有關性能/利用率的技巧,要下載的源代碼……

今天我們將看到:

  • 模型類和將生成數據庫數據的類
  • 查找方法; 使用getReference方法可獲得更好的性能,并使用log4j在控制臺中顯示查詢參數
  • JPQL:具有簡單參數或對象的查詢,聯接,排序依據,在關系中導航
  • JPQL:功能:AVG,COUNT,MAX,MIN,TRIM,SUM,UPPER,LOWER,MOD,LENGHT,SQRT; 使用HAVING,GROUP BY
  • JPQL:篩選條件:LIKE,IN,DISTINCT,EMPTY,BETWEEN,NULL,MEMBER OF,EXISTS(子查詢),ANY,ALL,SOME,CONCAT,CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,LOCATE,SIZE,SUBSTRING
  • JPA:NamedQuery,使用日期查詢,有關getSingleResult方法的警告
  • JPA:NativeQuery,名為NativeQuery
  • JPA:復雜的本地查詢
  • JPA:使用EJB優化查詢
  • JPA:分頁
  • JPA:數據庫提示
  • JPA:通過查詢創建對象
  • JPQL:批量更新和刪除
  • JPA:條件

您將看到在每個主類中,我們將調用方法“ CodeGenerator.generateData() ”。 此類方法僅在數據庫中創建數據; 有了這些數據,我們的查詢將找到正確的結果。

在這篇文章的最后一頁中,您會找到下載該文章源代碼的鏈接。

在本文中,我們將使用帶有Hibernate作為提供程序的JPA 2.0。 該數據庫將是HSQLDB,并將附加到該項目。 您可以下載源代碼并運行項目,而無需任何其他配置。 我們不會談論如何設置HSQLDB,因為本文的重點是如何查詢數據庫的數據。

這篇文章在某些方面不會使用開發的最佳實踐。 這篇文章的重點是展示JPA查詢的工作方式。

模型類和將生成數據庫數據的類

package com.model;import java.util.ArrayList; import java.util.List;import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.OneToOne;@Entity public class Person {@Id@GeneratedValue(strategy = GenerationType.AUTO)private int id;private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}@OneToMany(mappedBy = 'person', cascade = CascadeType.ALL)private List<Dog> dogs;@OneToOne(cascade = CascadeType.ALL)@JoinColumn(name='address_id')private Address address;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public List<Dog> getDogs() {if (dogs == null) {dogs = new ArrayList<Dog>();}return dogs;}public void setDogs(List<Dog> dogs) {this.dogs = dogs;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}@Overridepublic int hashCode() {return getId();}@Overridepublic boolean equals(Object obj) {if (obj instanceof Person) {Person person = (Person) obj;return person.getId() == getId();}return false;} }package com.model;import java.util.Date;import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.Temporal; import javax.persistence.TemporalType;@Entity public class Dog {@Id@GeneratedValue(strategy = GenerationType.AUTO)private int id;private String name;private double weight;@Temporal(TemporalType.TIMESTAMP)private Date dateOfBirth;public Dog() {}public Dog(String name, double weight, Date dateOfBirth) {this.name = name;this.weight = weight;this.dateOfBirth = dateOfBirth;}public static void main(String[] args) {System.out.println(new Date());}@ManyToOneprivate Person person;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getWeight() {return weight;}public void setWeight(double weight) {this.weight = weight;}public Date getDateOfBirth() {return dateOfBirth;}public void setDateOfBirth(Date dateOfBirth) {this.dateOfBirth = dateOfBirth;}public Person getPerson() {return person;}public void setPerson(Person person) {this.person = person;}@Overridepublic int hashCode() {return getId();}@Overridepublic boolean equals(Object obj) {if (obj instanceof Dog) {Dog dog = (Dog) obj;return dog.getId() == getId();}return false;} }package com.model;import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id;@Entity public class Address {@Id@GeneratedValue(strategy = GenerationType.AUTO)private int id;private String streetName;private int houseNumber;public Address() {}public Address(String streetName, int houseNumber) {this.streetName = streetName;this.houseNumber = houseNumber;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getStreetName() {return streetName;}public void setStreetName(String streetName) {this.streetName = streetName;}public int getHouseNumber() {return houseNumber;}public void setHouseNumber(int houseNumber) {this.houseNumber = houseNumber;}@Overridepublic int hashCode() {return getId();}@Overridepublic boolean equals(Object obj) {if (obj instanceof Address) {Address address = (Address) obj;return address.getId() == getId();}return false;} }

我們獲得了一些具有單向和雙向關系的基本類。 這些關系將幫助我們處理將要執行的所有類型的查詢。

為了生成數據庫數據,我們具有以下類:

package com.main;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence;import com.model.Address; import com.model.Dog; import com.model.Person;public class CodeGenerator {private static EntityManagerFactory emf;private static EntityManager em;public static final String PERSON01_NAME = 'John';public static final String PERSON02_NAME = 'Mary';public static final String PERSON03_NAME = 'Anna';public static final String PERSON04_NAME = 'Joseph';public static final String PERSON05_NAME = 'Mark';public static final String PERSON06_NAME = 'I will not have any relationship';public static void startConnection() {emf = Persistence.createEntityManagerFactory('JpaQuery');em = emf.createEntityManager();em.getTransaction().begin();}public static void closeConnection() {em.getTransaction().commit();emf.close();}public static void generateData() {int year = 1995;int month = 1;int day = 10;Dog dog01 = new Dog('Yellow', 3.5d, createNewDate(day, month, year));Dog dog02 = new Dog('Brown', 8.5d, createNewDate(++day, ++month, ++year));Dog dog03 = new Dog('Dark', 15.5d, createNewDate(++day, ++month, ++year));Dog dog04 = new Dog('Kaka', 4.3d, createNewDate(++day, ++month, ++year));Dog dog05 = new Dog('Pepe', 8.2d, createNewDate(++day, ++month, ++year));Dog dog06 = new Dog('Casillas', 6.1d, createNewDate(++day, ++month, ++year));Dog dog07 = new Dog('Fish', 6.7d, createNewDate(++day, ++month, ++year));Dog dog08 = new Dog('Lion', 3.1d, createNewDate(++day, ++month, ++year));Dog dog09 = new Dog('Cat', 5.5d, createNewDate(++day, ++month, ++year));Dog dog10 = new Dog('Java', 21.7d, createNewDate(++day, ++month, ++year));Dog dog11 = new Dog('JSF', 23.65d, createNewDate(++day, ++month, ++year));Dog dog12 = new Dog('VRaptor', 24.0d, createNewDate(++day, ++month, ++year));Dog dog13 = new Dog('Ferrari', 3.7d, createNewDate(++day, ++month, ++year));Dog dog14 = new Dog('Porshe', 1.33d, createNewDate(++day, ++month, ++year));Dog dog15 = new Dog('Bike', 4.44d, createNewDate(++day, ++month, ++year));Dog dog16 = new Dog('Rambo', 5.44d, createNewDate(++day, ++month, 2015));Dog dog17 = new Dog('Terminator', 3.88d, createNewDate(++day, ++month, 2016));Dog dog18 = new Dog('John McClan', 3.88d, createNewDate(++day, ++month, 2016));Person person01 = new Person(PERSON01_NAME, 33);person01.getDogs().add(dog01);person01.getDogs().add(dog02);person01.getDogs().add(dog03);person01.setAddress(new Address('Street A', 30));dog01.setPerson(person01);dog02.setPerson(person01);dog03.setPerson(person01);Person person02 = new Person(PERSON02_NAME, 27);person02.getDogs().add(dog04);person02.getDogs().add(dog05);person02.getDogs().add(dog06);person02.setAddress(new Address('Street B', 60));dog04.setPerson(person02);dog05.setPerson(person02);dog06.setPerson(person02);Person person03 = new Person(PERSON03_NAME, 7);person03.getDogs().add(dog07);person03.getDogs().add(dog08);person03.getDogs().add(dog09);person03.setAddress(new Address('Street B', 90));dog07.setPerson(person03);dog08.setPerson(person03);dog09.setPerson(person03);Person person04 = new Person(PERSON04_NAME, 43);person04.getDogs().add(dog10);person04.getDogs().add(dog11);person04.getDogs().add(dog12);person04.setAddress(new Address('Street C', 120));dog10.setPerson(person04);dog11.setPerson(person04);dog12.setPerson(person04);Person person05 = new Person(PERSON05_NAME, 70);person05.getDogs().add(dog13);person05.getDogs().add(dog14);person05.getDogs().add(dog15);person05.getDogs().add(dog16);person05.setAddress(new Address('Street D', 150));dog13.setPerson(person05);dog14.setPerson(person05);dog15.setPerson(person05);dog16.setPerson(person05);Person person06 = new Person(PERSON06_NAME, 45);em.persist(person01);em.persist(person02);em.persist(person03);em.persist(person04);em.persist(person05);em.persist(person06);em.persist(dog17);em.persist(dog18);em.flush();}private static Date createNewDate(int day, int month, int year) {SimpleDateFormat formatter = new SimpleDateFormat('dd/MM/yyyy');try {return formatter.parse('' + day + '/' + month + '/' + year);} catch (ParseException e) {e.printStackTrace();return null;}}public static EntityManager getEntityManager() {return em;} }

查找方法; 使用getReference方法可獲得更好的性能,并使用log4j在控制臺中顯示查詢參數

通常在我們對數據庫執行某些更改(例如更新某些對象屬性,關系或刪除它)之前調用find方法。

在下面,您將找到使用find方法的代碼:

package com.main;import javax.persistence.EntityManager;import com.model.Address; import com.model.Person;public class Page03 {public static void main(String[] args) {CodeGenerator.startConnection();CodeGenerator.generateData();EntityManager em = CodeGenerator.getEntityManager();Person person = em.find(Person.class, 1);int addressId = 2;// usually we send an id or a detached object from the viewsetAddressToOtherPerson(em, person, addressId);int personId = 4;// usually we send an id or a detached object from the viewdeletePerson(em, personId);CodeGenerator.closeConnection();}private static void setAddressToOtherPerson(EntityManager em, Person person, int addressId) {Address address = em.find(Address.class, addressId);person.setAddress(address);em.merge(person);em.flush();}private static void deletePerson(EntityManager em, int personId) {Person savedPerson = em.find(Person.class, personId);em.remove(savedPerson);em.flush();} }

注意,方法“ setAddressToOtherPerson ”和“ deletePerson ”僅使用find方法來更新引用或刪除對象。

find()方法具有優化的查詢功能,該功能將在持久性上下文中搜索對象,如果找不到該對象,它將查詢數據庫以帶來數據。 如果您獲得了以EAGER注釋的關系(例如:“ @OneToMany(fetch = FetchType.EAGER) ”),則find方法將從數據庫中帶走這些對象。 注意,對于諸如刪除參考更新之類的簡單任務,無需從數據庫中獲取所有這些數據。

EntityManager具有幫助這些簡單任務的特定方法。 EntityManager將執行一個簡單的查詢,例如“ 從Person p中選擇id,其中p.id =:personId ”。 我們將有一個更快,更小的查詢。

在下面,您可以看到我們將如何使用getReference:

package com.main;import javax.persistence.EntityManager;import com.model.Address; import com.model.Person;public class Page03 {public static void main(String[] args) {CodeGenerator.startConnection();CodeGenerator.generateData();EntityManager em = CodeGenerator.getEntityManager();Person person = em.find(Person.class, 1);int addressId = 2;// usually we send an id or a detached object from the viewsetAddressToOtherPerson(em, person, addressId);int personId = 4;// usually we send an id or a detached object from the viewdeletePerson(em, personId);CodeGenerator.closeConnection();}private static void setAddressToOtherPerson(EntityManager em, Person person, int addressId) {Address address = em.getReference(Address.class, addressId);person.setAddress(address);em.merge(person);em.flush();System.out.println('Merged');}private static void deletePerson(EntityManager em, int personId) {// usually is find or mergePerson savedPerson = em.getReference(Person.class, personId);em.remove(savedPerson);em.flush();System.out.println('Deleted');} }

使用“ getReference ”方法,您將僅查詢對象ID,將節省一些數據庫流量。

在下面,您將找到在控制臺中顯示JPA查詢參數所需的lo4j.properties配置。 通常,當我們使用Hibernate調用查詢時,Hibernate將使用“?”格式化查詢。 而不是使用實際價值。 使用下面的代碼,您將能夠看到查詢參數:

# Direct log messages to stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n# Root logger option log4j.rootLogger=ERROR, stdout# Hibernate logging options (INFO only shows startup messages) log4j.logger.org.hibernate=ERROR# Log JDBC bind parameter runtime arguments log4j.logger.org.hibernate.type=TRACE

如果要停用日志,則只需在lo4j.properties的最后一行用#符號注釋,并將“ persistence.xml”中的show_log配置設置為false。

JPQL:具有簡單參數或對象的查詢,聯接,排序依據,在關系中導航

要進行基本查詢,您只需要運行以下命令:“從Dog d中選擇d”。 您始終需要牢記的一件事是:為了執行這種查詢,我們使用JPQL而不是常規SQL 。

使用JPQL的優點是,它與SQL非常相似且可移植。 您可以在每個數據庫中使用相同的查詢而不會出現問題。

切勿將查詢與字符串連接。 如果您這樣查詢:“從Person p的p中選擇p,其中p.name” + person.getName(),則可以確保黑客會喜歡它。 他們使用這種代碼進行名為“ SQL注入”(或JPQL注入)的攻擊。 避免這種攻擊的方法是在您的查詢中添加參數,就像我們將在下面看到的那樣。

您將看到以下幾種執行查詢的方法:

package com.main;import java.util.List;import javax.persistence.EntityManager; import javax.persistence.Query;import com.model.Dog; import com.model.Person;public class Page04 {public static void main(String[] args) {CodeGenerator.startConnection();CodeGenerator.generateData();EntityManager em = CodeGenerator.getEntityManager();List<Dog> dogs = listAllDogs(em);for (Dog dog : dogs) {System.out.println(dog.getName());}Person person03 = findPersonByName(em, CodeGenerator.PERSON03_NAME);System.out.println(person03.getName());Person person01 = new Person();person01.setId(1);Person savedPerson = findPersonByPersonObject(em, person01);System.out.println(savedPerson.getName());List<Dog> dogsByWeight = listAllDogsOrderingByWeight(em);for (Dog dog : dogsByWeight) {System.out.println(dog.getWeight());}String addressName = findAddressNameOfPerson(em, CodeGenerator.PERSON04_NAME);System.out.println('Person 04 address is: ' + addressName);Person person02 = findPersonByNameWithAllDogs(em, CodeGenerator.PERSON02_NAME);for (Dog dog : person02.getDogs()) {System.out.println('Person 02 Dog: ' + dog.getName());}Person person05 = findPersonByNameThatMayNotHaveDogs(em, CodeGenerator.PERSON06_NAME);System.out.println('Is the list of the Dogs from the Person 05 empty? ' + person05.getDogs().size());CodeGenerator.closeConnection();}/*** Easiest way to do a query*/@SuppressWarnings('unchecked')private static List<Dog> listAllDogs(EntityManager em) {Query query = em.createQuery('select d from Dog d', Dog.class);return query.getResultList();}/*** Easiest way to do a query with parameters*/private static Person findPersonByName(EntityManager em, String name) {Query query = em.createQuery('select p from Person p where name = :name', Person.class);query.setParameter('name', name);return (Person) query.getSingleResult();}/*** Executes a query that has as parameter an object*/private static Person findPersonByPersonObject(EntityManager em, Person person) {Query query = em.createQuery('select p from Person p where p = :person');query.setParameter('person', person);return (Person) query.getSingleResult();}/*** Query that will list all dogs with an order*/@SuppressWarnings('unchecked')private static List<Dog> listAllDogsOrderingByWeight(EntityManager em) {Query query = em.createQuery('select d from Dog d order by d.weight desc', Dog.class);return query.getResultList();}/*** Query that get only a field instead a complete class object*/private static String findAddressNameOfPerson(EntityManager em, String name) {Query query = em.createQuery('select p.address.streetName from Person p where p.name = :name');query.setParameter('name', name);return (String) query.getSingleResult();}/*** Query that will fetch a lazy relationship Be carefull, with this kind of* query only those who have the relationship will come in the result*/private static Person findPersonByNameWithAllDogs(EntityManager em, String name) {Query query = em.createQuery('select p from Person p join fetch p.dogs where p.name = :name', Person.class);query.setParameter('name', name);return (Person) query.getSingleResult();}/*** With this query will will bring results that may not have arelationship*/private static Person findPersonByNameThatMayNotHaveDogs(EntityManager em, String name) {Query query = em.createQuery('select p from Person p left join fetch p.dogs where p.name = :name', Person.class);query.setParameter('name', name);return (Person) query.getSingleResult();} }

關于上面的代碼:

  • 每個查詢都使用特定的查詢文本和返回類像“ em.createQuery(“ HHH”,HHH.class) ”那樣調用。 您可以定義一個返回類,例如Person.class。 Person.class參數將向JPA指示返回對象。
  • 我們可以使用基本屬性作為查詢參數,例如“ p.name =:name ”或對象“ p =:person ”。 如果使用對象,則JPA將通過其@ID進行比較。
  • 如果要訂購查詢,則只需要執行以下操作:“ 按d.weight desc訂購 ”。 默認的訂單值為asc,您無需編寫。
  • 關于聯接,您必須注意我們使用的兩種聯接。 在“ findPersonByNameWithAllDogs ”方法中,我們僅使用“… Person p join fetch p.dogs …”來顯示狗列表。 我們需要使用join fetch,因為狗列表使用“ lazy”屬性進行了注釋。 如果我們不包括join fetch并執行了諸如“ person.getDogs() ”之類的命令,則需要其他“ trip ”到數據庫。 如果使用此查詢查找沒有狗的人,則無論數據庫是否有沒有狗的人,JPA都不會在數據庫中找到任何數據。 如果您要執行一個查詢,其中包含獲取狗的集合,而有或沒有狗的人則需要使用“ …人p左連接獲取p.dogs… ”,就像我們在方法中所做的那樣:“ findPersonByNameThatMayNotHaveDogs ”。 “ 左連接獲取 ”將帶來一個空狗列表的人。

JPQL:功能:AVG,COUNT,MAX,MIN,TRIM,SUM,UPPER,LOWER,MOD,LENGHT,SQRT; 使用HAVING,GROUP BY

JPQL還有很多功能可以幫助我們進行查詢。 在下面您可以看到他們的描述:

  • AVG –數字平均值
  • COUNT –計算查詢找到的記錄數量
  • MAX –獲取列的較高值
  • MIN-獲取列的下限值
  • TRIM –刪除文本開頭/結尾處的空白
  • SUM –對列的所有值求和
  • 大寫–將所有列文本修改為大寫
  • LOWER-將所有列文本修改為小寫
  • MOD –返回列的模數
  • LENGTH –返回字符串的大小
  • SQRT –返回數字的平方根

在下面,您將看到如何使用這些功能:

package com.main;import java.util.List;import javax.persistence.EntityManager; import javax.persistence.Query;import com.model.Person;public class Page05 {public static void main(String[] args) {CodeGenerator.startConnection();CodeGenerator.generateData();EntityManager em = CodeGenerator.getEntityManager();Number average = getPersonsAgeAverage(em);System.out.println(average);List<Object[]> personsFilteredByDogsWeight = getPersonsWithDogsWeightHigherThan(em, 4d);for (Object[] objects : personsFilteredByDogsWeight) {Person person = (Person) objects[0];Long count = (Long) objects[1];System.out.println('The person : ' + person.getName() + ' has ' + count + ' dogs with the weight > 4');}List<Object[]> dogsMinAndMaxWeightList = getDogMinAndMaxWeight(em);Object[] dogMinAndMaxWeightResult = dogsMinAndMaxWeightList.get(0);System.out.println('Min: ' + dogMinAndMaxWeightResult[0] + ' Max: ' + dogMinAndMaxWeightResult[1]);Number sumOfAllAges = getTheSumOfAllAges(em);System.out.println('All summed ages are: ' + sumOfAllAges);String loweredCaseName = getLoweredCaseNameFromUpperCase(em, CodeGenerator.PERSON03_NAME);System.out.println(loweredCaseName);Number personAgeMod = getPersonAgeMode(em, CodeGenerator.PERSON05_NAME, 6);System.out.println('Person modulus age: ' + personAgeMod);Number personAgeSqrt = getPersonAgeSqrtUsingTrim(em, ' ' + CodeGenerator.PERSON04_NAME + ' ');System.out.println('Person modulus age: ' + personAgeSqrt);List<Object[]> personsByDogsAmount = getPersonByHavingDogAmountHigherThan(em, 3);for (Object[] objects : personsByDogsAmount) {Person person = (Person) objects[0];Long count = (Long) objects[1];System.out.println(person.getName() + ' has ' + count + ' dogs');}CodeGenerator.closeConnection();}/*** Uses the AVG sql database function*/private static Number getPersonsAgeAverage(EntityManager em) {Query query = em.createQuery('select avg(p.age) from Person p');return (Number) query.getSingleResult();}/*** This query will use the count database function** @return List<Object[]> where object[0] is a person, object [2] is a Long*/@SuppressWarnings('unchecked')private static List<Object[]> getPersonsWithDogsWeightHigherThan(EntityManager em, double weight) {Query query = em.createQuery('select p, count(p) from Person p join p.dogs d where d.weight > :weight group by p');query.setParameter('weight', weight);return query.getResultList();}/*** This query will use the min and max sql database function** @return List<Object[]> where object[0] is the min, object [2] is the max*/@SuppressWarnings('unchecked')private static List<Object[]> getDogMinAndMaxWeight(EntityManager em) {Query query = em.createQuery('select min(weight), max(weight) from Dog');return query.getResultList();}/*** This query will use the sum sql database function*/private static Number getTheSumOfAllAges(EntityManager em) {Query query = em.createQuery('select sum(p.age) from Person p');return (Number) query.getSingleResult();}/*** Method that uses the UPPER and LOWER database functions*/private static String getLoweredCaseNameFromUpperCase(EntityManager em, String name) {Query query = em.createQuery('select lower(p.name) from Person p where UPPER(p.name) = :name');query.setParameter('name', name.toUpperCase());return (String) query.getSingleResult();}/*** Method that uses the mod database function*/private static Number getPersonAgeMode(EntityManager em, String personName, int modBy) {Query query = em.createQuery('select mod(p.age, :modBy) from Person p where p.name = :name');query.setParameter('modBy', modBy);query.setParameter('name', personName);return (Number) query.getSingleResult();}/*** Method that uses the square root of a person age using the trim function in the name*/private static Number getPersonAgeSqrtUsingTrim(EntityManager em, String name) {Query query = em.createQuery('select sqrt(p.age) from Person p where p.name = trim(:name)');query.setParameter('name', name);return (Number) query.getSingleResult();}/*** Method that uses the having comparator with count*/@SuppressWarnings('unchecked')private static List<Object[]> getPersonByHavingDogAmountHigherThan(EntityManager em, long dogAmount) {Query query = em.createQuery('select p, count(p) from Person p join p.dogs group by p.id having count(p) > :dogAmount');query.setParameter('dogAmount', dogAmount);return query.getResultList();} }

關于上面的代碼:

  • 在方法“ getPersonsAgeAverage ”中,我們使用“ avg”函數對年齡列值進行平均計算。
  • 在“ getPersonsWithDogsWeightHigherThan ”方法中,我們使用count函數將攜帶人對象的狗的數量帶入。 注意,我們有兩個不同的結果,一個數字和一個人物對象。 這些值將位于Object []數組中。
  • LOWER和UPPER函數將更改您的字符串大小寫,您可以使用它來更改查詢結果(在選擇之后)或在where條件下。 “ getLoweredCaseNameFromUpperCase ”方法以兩種方式使用LOWER和UPPER函數。
  • “ getPersonAgeMode ”在單詞select之后使用一個參數。 使用JPA,我們可以在查詢的任何位置使用參數,您只需要在變量中添加“:”即可。 您可以多次使用相同的參數,并使用query.setParameter方法傳遞值。
  • 在方法“ getPersonByHavingDogAmountHigherThan ”中,“ 具有 ”功能與“ 計數 ”功能一起調用。 我們可以使用“ 具有 ”功能來幫助我們過濾查詢數據結果。

JPQL:篩選條件:LIKE,IN,DISTINCT,EMPTY,BETWEEN,NULL,MEMBER OF,EXISTS(子查詢),ANY,ALL,SOME,CONCAT,CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,LOCATE,SIZE,SUBSTRING

其中一些功能具有相同目的,但處理方式不同。

在下面您可以看到如何使用這些功能:

package com.main;import java.text.SimpleDateFormat; import java.util.Date; import java.util.List;import javax.persistence.EntityManager; import javax.persistence.Query;import com.model.Dog; import com.model.Person;public class Page06 {public static void main(String[] args) {CodeGenerator.startConnection();CodeGenerator.generateData();EntityManager em = CodeGenerator.getEntityManager();List<Person> personByLike = getPersonByNameUsingLike(em, 'oh');for (Person person : personByLike) {System.out.println(person.getName());}List<Person> personsByAdressNumber = getPersonsByAddressNumberHigherThan(em, 90);for (Person person : personsByAdressNumber) {System.out.println(person.getName());}List<Person> personsWithoutDogs = getPersonsWithoutDogs(em);System.out.println('Total of persons without dogs: ' + personsWithoutDogs.size());List<Person> personsWithoutAddress = getPersonsWithoutAddress(em);System.out.println('Total of persons without address: ' + personsWithoutAddress.size());try {SimpleDateFormat formatter = new SimpleDateFormat('dd/MM/yyyy');Date startDate = formatter.parse('01/01/1996');Date endDate = formatter.parse('01/01/1999');List<Dog> dogsByBirth = getDogByBirthDate(em, startDate, endDate);for (Dog dog : dogsByBirth) {System.out.println(dog.getName() + ': ' + formatter.format(dog.getDateOfBirth()));}} catch (Exception e) {e.printStackTrace();}Dog dog = (Dog) em.createQuery('select d from Dog d where d.id = 1', Dog.class).getSingleResult();boolean belongsTo = isThisDogBelongingToAperson(em, dog, CodeGenerator.PERSON01_NAME);System.out.println('Is this Dog member of Perons01? ' + belongsTo);Person personByConcatedName = getPersonConcatingName(em, 'Ma', 'ry');System.out.println('Found the person? ' + personByConcatedName.getName());List<Person> personByLocate = getPersonByLocatingStringInTheName(em, 'Mary');System.out.println('Amount of persons found by locate: ' + personByLocate.size());String personNameBySubstring = getPersonNameBySubstring(em, CodeGenerator.PERSON06_NAME, 12, 18);System.out.println('Name substring is: ' + personNameBySubstring);List<Person> personsDogWeight = getPersonByDogWeightOnlyHigherThan(em, 20);for (Person person : personsDogWeight) {System.out.println(person.getName());}List<Person> distinctPersons = getDistinctPersonsByDogsWeight(em, 2d);System.out.println('With the distinct, the result size is: ' + distinctPersons.size());List<Person> personsWithDogsAmount = getPersonsWithDougsAmountOf(em, 4);System.out.println('Number of persons with 4 dogs: ' + personsWithDogsAmount.size());Number numberOfDogsByPerson = getDogAmountByPerson(em, CodeGenerator.PERSON04_NAME);System.out.println('The dog amount is to ' + CodeGenerator.PERSON04_NAME + ': ' + numberOfDogsByPerson);List<Dog> dogsBornedAfterToday = getDogsBornAfterToday(em);System.out.println('The amount of dogs borned after today is: ' + dogsBornedAfterToday.size());CodeGenerator.closeConnection();}/*** This methods compares a value with LIKE*/@SuppressWarnings('unchecked')private static List<Person> getPersonByNameUsingLike(EntityManager em, String name) {Query query = em.createQuery('select p from Person p where p.name like :name');query.setParameter('name', '%' + name + '%');return query.getResultList();}/*** This methods show several ways to do a query that checks if a part of a collection is inside another*/@SuppressWarnings('unchecked')private static List<Person> getPersonsByAddressNumberHigherThan(EntityManager em, int houseNumber) {Query query = em.createQuery('select p from Person p where p.address in (select a from Address a where a.houseNumber > :houseNumber)');// Query query = em.createQuery('select p from Person p where (select a from Address a where a.houseNumber > :houseNumber and p.address = a) > 0');// Query query = em.createQuery('select p from Person p where p.address = any (select a from Address a where a.houseNumber > :houseNumber)');// Query query = em.createQuery('select p from Person p where p.address = some (select a from Address a where a.houseNumber > :houseNumber)');// Query query = em.createQuery('select p from Person p where exists (select a from p.address a where a.houseNumber > :houseNumber)');query.setParameter('houseNumber', houseNumber);return query.getResultList();}/*** This methods show how to check if a collection is empty*/@SuppressWarnings('unchecked')private static List<Person> getPersonsWithoutDogs(EntityManager em) {Query query = em.createQuery('select p from Person p where p.dogs is empty');return query.getResultList();}/*** This method shows two ways to check if a relationship @OneToOne is empty*/@SuppressWarnings('unchecked')private static List<Person> getPersonsWithoutAddress(EntityManager em) {Query query = em.createQuery('select p from Person p where p.address is null');// Query query = em.createQuery('select p from Person p where p.address is empty');return query.getResultList();}/*** Method that uses the between comparation*/@SuppressWarnings('unchecked')private static List<Dog> getDogByBirthDate(EntityManager em, Date startDate, Date endDate) {Query query = em.createQuery('select d from Dog d where d.dateOfBirth between :startDate and :endDate');query.setParameter('startDate', startDate);query.setParameter('endDate', endDate);return query.getResultList();}/*** Method that uses the member of comparation to check if an object belogs to a collection*/private static boolean isThisDogBelongingToAperson(EntityManager em, Dog dog, String name) {Query query = em.createQuery('select p from Person p where :dog member of p.dogs and p.name = :name');query.setParameter('dog', dog);query.setParameter('name', name);try {return query.getSingleResult() != null;} catch (Exception e) {return false;}}/*** Methods that concats Strings*/private static Person getPersonConcatingName(EntityManager em, String firstWord, String secondWord) {Query query = em.createQuery('select p from Person p where p.name = concat(:firstWord, :secondWord)', Person.class);query.setParameter('firstWord', firstWord);query.setParameter('secondWord', secondWord);return (Person) query.getSingleResult();}/*** Method that locates a string inside another*/@SuppressWarnings('unchecked')private static List<Person> getPersonByLocatingStringInTheName(EntityManager em, String valueToBeLocated) {Query query = em.createQuery('select p from Person p where locate(p.name, :value) > 0', Person.class);query.setParameter('value', valueToBeLocated);return query.getResultList();}/*** Methods that uses the ALL comparator*/@SuppressWarnings('unchecked')private static List<Person> getPersonByDogWeightOnlyHigherThan(EntityManager em, double weight) {Query query = em.createQuery('select p from Person p where p.dogs is not empty and :weight < all (select d.weight from p.dogs d)');query.setParameter('weight', weight);return query.getResultList();}/*** Method that uses the distinct to remove any repetetition*/@SuppressWarnings('unchecked')private static List<Person> getDistinctPersonsByDogsWeight(EntityManager em, double weight) {Query query = em.createQuery('select distinct p from Person p join p.dogs d where d.weight > :weight');query.setParameter('weight', weight);return query.getResultList();}/*** Method that uses the substring to get just a position of chars inside the string*/private static String getPersonNameBySubstring(EntityManager em, String personName, int startPosition, int endPosition) {Query query = em.createQuery('select substring(p.name, :startPosition, :endPosition) from Person p where p.name = :personName');query.setParameter('personName', personName);query.setParameter('startPosition', startPosition);query.setParameter('endPosition', endPosition);return (String) query.getSingleResult();}/*** Method that checks the size of a collection*/@SuppressWarnings('unchecked')private static List<Person> getPersonsWithDougsAmountOf(EntityManager em, int dogAmount) {Query query = em.createQuery('select p from Person p where size(p.dogs) = :dogAmount');query.setParameter('dogAmount', dogAmount);return query.getResultList();}/*** Method that gets the size of a collection*/private static Number getDogAmountByPerson(EntityManager em, String personName) {Query query = em.createQuery('select size(p.dogs) from Person p where p.name = :personName');query.setParameter('personName', personName);return (Number) query.getSingleResult();}/*** Methods that uses the current database server date/time*/@SuppressWarnings('unchecked')private static List<Dog> getDogsBornAfterToday(EntityManager em) {Query query = em.createQuery('select d from Dog d where d.dateOfBirth > CURRENT_DATE');return query.getResultList();} }

關于上面的代碼:

  • 您可以在查詢中添加“ NOT”字樣。 如果使用“ IS EMPTY ”,則將搜索沒有值的集合; 如果您使用“ IS NOT EMPTY ”,則將搜索已填充的集合。
  • “ getPersonsByAddressNumberHigherThan ”顯示了如何使用不同的功能執行相同的查詢。 所有帶注釋的命令行將帶來相同的結果。 In / Any / Some / Exists具有緊密的語法。 根據Pro EJB3的書,“ Some ”是“ Any”的別名。
  • 比較器“ IS EMPTY ”可用于檢查集合(例如@OneToMany)或關系類(例如@OneToOne)。 “ IS NULL ”比較器無法檢查集合,但是您可以使用它來檢查非集合屬性(例如@OneToOne)。
  • “ MEMBER OF ”比較器將檢查給定參數是否屬于集合。
  • “ CONCAT”功能可以用作條件比較器或查詢結果。 在上面的代碼中,它只是用作比較器,但您可以像這樣使用它:“從Person p中選擇concat(firstName,lastName)”
  • 在“ getPersonByDogWeightOnlyHigherThan ”方法中,我們使用ALL運算符。 僅當條件的所有項目(“ :weight> ALL” )均返回true時,此運算符才返回true。 在這種方法中,只有當所有狗的體重都大于“:weight”時,它才會返回true;如果只有一只狗的體重值較小,則比較器將返回false。 您必須知道, 如果列表為空,則比較器將返回true 。 為了避免這種行為,您需要像方法中那樣檢查列表是否為空:“ p.dogs不為空 ”。
  • “ distinct ”功能將刪除重復的對象。 在方法“ getDistinctPersonsByDogsWeight ”中,“ distinct ”功能將刪除重復的人。
  • “ SUBSTRING ”函數從給定的字符串中提取一個值。 您將設置將從原始值中提取的值的開始和結束。 您也可以將此功能用作比較器。
  • “ SIZE ”函數將返回集合中的元素數量。 您可以用作比較器或獲取值。
  • 在上面的代碼中,我們使用“ CURRENTE_DATE ”函數比較日期,您也可以使用“ CURRENT_TIME,CURRENT_TIMESTAMP ”。 JPA規范指出,當前日期函數只能用作比較器。 JPA目前尚不支持任何功能來檢索數據庫的當前日期,因為這種功能不是數據庫可移植的( 4.6.16函數表達式– JSR-000220 Enterprise JavaBeans 3.0 Final Release(持久性) )。 如果要查詢數據庫日期,則可以使用NativeQuery來獲取此值。
  • 我必須始終記住,您不能在集合內部導航。 您不能執行以下命令:“ person.dogs.name”。 您可以使用以下命令訪問狗的名字: 從Person中選擇p,然后取入p.dogs d,其中d.name ='' 。

繼續進行本系列的第二部分 。

參考: uaiHebert博客上來自JCG合作伙伴 Hebert Coelho的JPA查詢和技巧 。


翻譯自: https://www.javacodegeeks.com/2012/07/ultimate-jpa-queries-and-tips-list-part.html

總結

以上是生活随笔為你收集整理的终极JPA查询和技巧列表–第1部分的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

一区二区三区在线看 | 国产精品嫩草影视久久久 | 国产精品乱码在线 | 国产区免费在线 | 国产黄 | 免费精品在线 | 国产成人精品久久久久蜜臀 | 天天干,天天操,天天射 | 国产福利一区在线观看 | 久久久综合九色合综国产精品 | 91色吧| 色综合久久88色综合天天 | 国产精品11| 婷婷中文在线 | 中国黄色一级大片 | 96在线 | 日本大尺码专区mv | 亚洲精品乱码久久久久久蜜桃不爽 | 婷婷草 | 欧美黑人巨大xxxxx | 成人一级黄色片 | 亚洲成人黄色网址 | 91人人爱| 中文字幕高清免费日韩视频在线 | 日韩中文字幕亚洲一区二区va在线 | 国产不卡视频在线 | 99久久精品国 | 日韩高清精品一区二区 | 日韩精品电影在线播放 | 日韩中文字幕91 | 五月婷婷中文网 | 性色av免费在线观看 | 日韩精品视频免费看 | 国产精品大全 | 欧美日韩国产页 | 黄色一级影院 | 天天操天天操天天操天天 | japanesexxxhd奶水| 久久99精品久久只有精品 | 久久久鲁 | 在线免费av网 | 四虎在线免费观看视频 | 麻豆精品传媒视频 | 成人在线一区二区 | 国产精品综合久久久久 | 在线观看mv的中文字幕网站 | 欧美精品免费一区二区 | 丁香九月激情综合 | zzijzzij亚洲日本少妇熟睡 | 五月开心综合 | 九九九电影免费看 | 天天摸夜夜操 | 中文字幕av一区二区三区四区 | 公与妇乱理三级xxx 在线观看视频在线观看 | 99久久久久久国产精品 | 97色国产 | 在线电影 你懂得 | 成人永久在线 | 少妇bbw搡bbbb搡bbb | 国产一级不卡毛片 | 三级av小说 | 成人动漫一区二区三区 | 免费看污片 | 国产网红在线观看 | 狠狠干狠狠久久 | 久久国产精品99久久久久久进口 | 欧美久久成人 | 国产精品尤物视频 | 中文字幕一区二区三区在线观看 | 欧美一区免费在线观看 | 天天射天天操天天干 | 免费观看性生活大片 | 国产视频一区精品 | 中文字幕乱码亚洲精品一区 | 日本三级久久 | 成人午夜电影网 | 国产精品a级 | 日韩试看| 亚洲天天综合网 | 爱爱av在线| 久久66热这里只有精品 | 超碰免费久久 | 日日夜夜精品 | 亚洲精品理论片 | 成人精品一区二区三区中文字幕 | 久久久国产精品人人片99精片欧美一 | 亚洲码国产日韩欧美高潮在线播放 | 超碰97免费观看 | 色欲综合视频天天天 | 999久久国精品免费观看网站 | 伊人天天狠天天添日日拍 | 欧洲精品一区二区 | 国产精品一区二区三区视频免费 | 综合天堂av久久久久久久 | 日韩精品久久一区二区 | 99色在线播放 | 国产精品99久久久久久人免费 | 日韩久久久 | 国产黄网站在线观看 | 超碰人人草 | 日本天天操 | 麻豆传媒在线免费看 | 人人精久| 欧美午夜a | 欧美一区免费在线观看 | 婷婷网五月天 | 人人爽人人爽人人爽人人爽 | 99精品久久久 | 人成午夜视频 | 天天干天天操天天搞 | 96精品在线 | 丁香电影小说免费视频观看 | 五月婷婷天堂 | 国产精品久久久久久久久久久久久 | 久久午夜免费观看 | 久久激情精品 | 免费毛片一区二区三区久久久 | 在线国产黄色 | 最近日本韩国中文字幕 | 国产99久久久精品 | 夜夜视频欧洲 | 久久a久久 | 日本在线观看一区 | 在线免费亚洲 | 国产精品av在线 | 99精品视频网 | 男女激情免费网站 | 中文字幕在线观看视频一区二区三区 | 久久视频99 | av丝袜制服 | 一区二区三区手机在线观看 | 一本一本久久a久久精品综合 | 国产污视频在线观看 | 最近中文字幕在线 | avwww在线观看 | 黄色三级在线观看 | 亚洲欧美日韩精品一区二区 | 最近中文字幕mv免费高清在线 | 国产精品夜夜夜一区二区三区尤 | 久久69精品| 啪啪av在线 | 九九爱免费视频在线观看 | 国内外成人在线 | 欧美日韩国产综合网 | 欧美另类激情 | 中文字幕在线观看三区 | 日本xxxxav| 国产成人精品一区二区三区 | 色吊丝在线永久观看最新版本 | 国产一二三在线视频 | 色在线国产 | 天天操天天玩 | 国产精品美女久久久久久久网站 | 久久国产精品二国产精品中国洋人 | 久久精品视频免费 | 欧美一级日韩三级 | 激情丁香| 深爱激情五月综合 | 国产精品欧美久久久久久 | 久久久精品网 | 欧美孕妇与黑人孕交 | 一区二区三区免费在线观看视频 | 国产区高清在线 | 99婷婷狠狠成为人免费视频 | 色综合久久久久久久久五月 | 99免费在线视频观看 | 日韩精品一区二区在线观看视频 | 在线午夜电影神马影院 | 丁香高清视频在线看看 | 天天干天天草 | 国产精品高清免费在线观看 | 免费观看国产精品视频 | 亚洲成人av在线电影 | 欧美性生爱 | 黄色h在线观看 | 超碰人人超碰 | 丁香六月五月婷婷 | 成人欧美亚洲 | 久久99久久99精品中文字幕 | 五月婷婷网站 | 国产精品久久久久久久电影 | 久久99国产一区二区三区 | 精品二区视频 | 91福利影院在线观看 | 日日夜夜噜噜噜 | 日日夜操 | 国产精品成人免费 | 精品亚洲一区二区三区 | 亚洲影院色 | 奇米网777| 在线观看视频在线观看 | 91丨九色丨高潮 | 在线播放 日韩专区 | 亚洲成人黄色在线观看 | 91久久国产露脸精品国产闺蜜 | 五月婷婷丁香综合 | 亚洲欧洲精品在线 | 岛国av在线免费 | 国产精品久久久777 成人手机在线视频 | 日韩电影在线看 | 国产精品高潮久久av | 亚洲欧美日韩精品久久奇米一区 | 五月天久久久久久 | 日韩特级毛片 | 国产 视频 高清 免费 | 日韩字幕 | 国产又粗又长的视频 | 精品国产亚洲日本 | 久久精品国产一区二区 | 久久亚洲私人国产精品 | 久久国产精品电影 | 欧美日韩国产一区二区三区在线观看 | 激情综合网在线观看 | 亚洲一区二区三区毛片 | 亚洲国产手机在线 | 91精品网站在线观看 | 久草视频在线资源站 | 欧美一级黄色网 | 激情视频一区 | 欧美日韩1区 | 久久精品国产免费看久久精品 | 91麻豆网| 久久69av| 蜜臀av免费一区二区三区 | 2023av在线| 天天插日日射 | 三级av免费观看 | 亚洲国产精久久久久久久 | 欧美日韩国产在线一区 | 黄色a级片在线观看 | 最新国产精品久久精品 | 97视频网址 | 成人黄视频 | 在线免费黄 | 超碰97中文 | 99视频精品免费视频 | 日韩v欧美v日本v亚洲v国产v | 欧美ⅹxxxxxx | 91丨九色丨国产女 | 国产中文在线字幕 | 人人澡超碰碰97碰碰碰软件 | 在线av资源 | 亚洲免费精彩视频 | 欧美最新另类人妖 | 成人影片在线播放 | 日韩网站免费观看 | 97在线免费视频观看 | 欧美日韩中文视频 | 狠狠干狠狠艹 | 999精品在线| 国产精品综合久久 | av在线成人 | 免费三级影片 | 欧美亚洲免费在线一区 | 激情综合网色播五月 | 国产精品毛片久久久 | 97偷拍在线视频 | 精品国产免费看 | 久久这里只有精品视频99 | 日日天天av | 久久久久女人精品毛片九一 | 久久午夜网 | 最新中文字幕在线播放 | 日韩欧美综合精品 | 久久免费电影网 | 日韩黄色软件 | 狠狠色狠狠色综合日日92 | 天堂av在线免费观看 | 国产这里只有精品 | 91九色视频在线 | 久久久久久片 | 亚洲欧美激情精品一区二区 | 国产精品成人一区二区三区吃奶 | 麻豆综合网 | 天天天天综合 | 亚洲欧美日韩国产精品一区午夜 | 免费一级特黄录像 | 国精产品满18岁在线 | 国产精品一区二区久久国产 | 涩涩网站在线观看 | 久久激情婷婷 | 在线观看黄网 | 国产精品男女啪啪 | 亚洲精品自在在线观看 | 日韩视频中文字幕在线观看 | 97精品国产91久久久久久久 | 日韩综合一区二区三区 | 国产一级在线看 | 四虎在线免费观看 | 久久艹综合 | 在线91精品 | 精品视频在线视频 | av中文字幕免费在线观看 | 18久久久久| 亚洲自拍自偷 | www99精品| av解说在线 | 九九热在线观看视频 | 亚洲三级在线 | 中文字幕高清免费日韩视频在线 | 国产h片在线观看 | 91在线永久| 九九九视频精品 | 97色免费视频| 免费观看成年人视频 | av电影不卡在线 | 99视频在线精品 | 一区二区视频欧美 | 国产剧情在线一区 | 日日干美女 | 四虎影视成人精品国库在线观看 | 91在线观看视频网站 | 综合五月| 激情av一区二区 | 亚洲精品白浆高清久久久久久 | 三级视频日韩 | 四虎影视成人永久免费观看视频 | 色就是色综合 | 99久久精| 国产精品久久久久久电影 | 四虎国产精 | 久草在线视频在线观看 | 日韩欧美在线不卡 | 欧美在线18 | 韩国av在线播放 | 国产精品18久久久 | 午夜免费久久看 | 国产视频在线观看一区 | 国内综合精品午夜久久资源 | 精品在线视频一区 | 国产黑丝一区二区 | 亚洲va欧美 | 97超碰网 | 国产成人精品av在线 | 99精品久久99久久久久 | 久久综合狠狠综合久久狠狠色综合 | 国产免费三级在线观看 | 成人久久免费视频 | 91在线精品一区二区 | 日韩a在线看 | 奇米影视在线99精品 | 久久久久久久影院 | 98涩涩国产露脸精品国产网 | 免费成人在线视频网站 | 久草电影免费在线观看 | 在线天堂v | 国产丝袜| 69亚洲精品| 亚洲动漫在线观看 | 伊人国产在线播放 | 久久国产精品一区二区三区四区 | 日本中文字幕免费观看 | 日韩欧美国产免费播放 | 精品视频在线观看 | 久久精品国产亚洲精品2020 | 五月激情六月丁香 | 久草视频播放 | 欧洲一区二区三区精品 | 天天操狠狠操夜夜操 | 亚洲免费精品视频 | 日日夜夜精品免费视频 | 精品九九久久 | 麻豆视频免费观看 | 91成人免费在线视频 | 欧美精品一区在线 | 黄色录像av | 成人免费观看在线视频 | 新av在线| 欧美性护士 | 国产精品黄色影片导航在线观看 | 91黄色在线观看 | av高清免费 | 亚洲国产日韩欧美 | 中文在线亚洲 | 激情五月婷婷综合网 | 欧美国产日韩在线视频 | 人人爱天天操 | a天堂最新版中文在线地址 久久99久久精品国产 | 日日操天天操狠狠操 | 午夜在线观看一区 | 欧美一级特黄aaaaaa大片在线观看 | 国产成人性色生活片 | 在线观看一区视频 | 一本之道乱码区 | 久久精品五月 | 久久刺激视频 | 久久你懂的 | 2023亚洲精品国偷拍自产在线 | 91色视频 | 性色视频在线 | 激情视频在线观看网址 | 国产亚洲在线视频 | 91黄色小网站 | 国产高清在线免费视频 | 国产区在线 | 亚洲国产午夜精品 | 99久久99久久 | 99久久久久久久久久 | 韩国在线一区二区 | 免费观看成年人视频 | 国产免码va在线观看免费 | 精品美女在线视频 | 国产电影黄色av | 婷婷伊人综合亚洲综合网 | 亚洲激情中文 | 在线视频日韩一区 | 最近中文字幕完整高清 | 九色琪琪久久综合网天天 | 国产日本在线播放 | 国产情侣一区 | 国产精品久久久久久爽爽爽 | 精品国产综合区久久久久久 | 久久污视频 | 久久精品视频在线看 | 在线观看黄色小视频 | 狠狠狠操 | 开心色激情网 | 欧美一区二区免费在线观看 | 欧美日韩国产一区二区在线观看 | 欧美一级欧美一级 | 国产一区二区免费 | 9ⅰ精品久久久久久久久中文字幕 | 亚洲九九九在线观看 | 天天天色 | 国产免费叼嘿网站免费 | 国模视频一区二区 | 国产精品久久久久久久久久三级 | 中文字幕美女免费在线 | 激情欧美xxxx| 国产视频999 | 国产精品美女免费看 | 国产精品网红福利 | 玖玖视频免费在线 | 91精品在线看 | 午夜av一区 | 国产一级视屏 | 国产一级淫片免费看 | 亚洲日本国产 | 欧美成人理伦片 | 日韩中文免费视频 | 激情丁香月| 2022中文字幕在线观看 | 99久久精品国产一区二区三区 | 色婷婷激情网 | 久久久免费毛片 | 狠狠狠狠狠狠 | 欧美成人精品欧美一级乱 | www天天干 | 欧美人牲 | 国产日韩精品视频 | 国产又粗又猛又色 | 色吊丝在线永久观看最新版本 | 在线成人一区 | 视频91| 日韩有码在线播放 | 日韩中文字幕免费视频 | 国产午夜精品免费一区二区三区视频 | 91精品久久久久久久久久久久久 | 日韩 国产 | 亚洲精品动漫成人3d无尽在线 | 国产中文字幕视频在线观看 | 国产午夜av | 91免费版在线 | www.色午夜 | 91污视频在线观看 | 久久久久久久久久久影视 | 国产成人精品不卡 | 91精品久久久久久粉嫩 | 深爱激情站 | 日本最新高清不卡中文字幕 | 国产精品亚洲人在线观看 | 国产精品xxxx18a99 | 香蕉视频在线视频 | 国产精品久久久久久久久久久久午夜 | 99视频免费观看 | av网址在线播放 | 狠狠干 狠狠操 | 91天堂素人约啪 | 成人免费中文字幕 | 人人躁| 久草在线91 | 久久久久麻豆v国产 | 欧美色图视频一区 | 特级毛片网站 | 国产69久久精品成人看 | 国产色婷婷在线 | 肉色欧美久久久久久久免费看 | 天天爽夜夜爽人人爽一区二区 | 一二区电影| 草草草影院 | www国产精品com| 久久九九久久九九 | 成人夜晚看av | 91九色蝌蚪视频在线 | 日韩色综合 | 亚洲精品国产麻豆 | 日韩中文字幕视频在线观看 | 91精品国产高清自在线观看 | 免费中午字幕无吗 | 国产99自拍 | 国产精品a成v人在线播放 | 草久在线观看视频 | 中文字幕在线精品 | 在线观看国产一区二区 | 五月天欧美精品 | 99视频在线精品 | 国产系列在线观看 | 久久人人爽人人爽人人片av软件 | 99re国产视频| 日韩v在线91成人自拍 | 日日干av | 欧美国产精品久久久久久免费 | 日韩av有码在线 | 国产视 | 成人在线播放视频 | 久久伊人色综合 | 日韩区视频 | 黄色软件视频大全免费下载 | 久久免费公开视频 | 色激情在线 | 久99久精品| 色久天| 亚洲精品国精品久久99热一 | 国产一级片免费视频 | 亚洲精品高清视频在线观看 | 不卡的av在线播放 | 国产精品久久久区三区天天噜 | 日韩aⅴ视频 | 中文超碰字幕 | 人人看人人爱 | 欧美综合在线观看 | 免费看在线看www777 | 三级av免费观看 | 天天要夜夜操 | 永久免费在线 | 免费成人av | 成人福利在线播放 | 99r在线观看 | 久久1区 | 四虎影视久久久 | 在线色资源 | 黄色1级毛片 | 成人久久18免费网站 | 国产精品色在线 | 丝袜制服天堂 | av一级片网站| 国产成人精品一区二区三区 | aaa免费毛片 | 久久久久免费精品视频 | 91在线永久 | 日韩视频www| 天天射狠狠干 | 特黄一级毛片 | 国产91勾搭技师精品 | 久久免费视屏 | 久久新 | 狠狠做深爱婷婷综合一区 | 一区二区不卡高清 | 天天爱天天插 | 久久久高清一区二区三区 | 综合网天天射 | 永久免费的av电影 | 亚洲久草网 | 精品国产乱码久久久久 | 久久成人国产精品 | 日韩字幕 | 亚洲综合激情五月 | 精品国产伦一区二区三区观看方式 | www.夜夜骑.com | 五月婷婷av在线 | 字幕网在线观看 | 日韩精品中字 | 99久久综合国产精品二区 | a在线播放| 午夜色婷婷 | www.五月婷 | 久久爱992xxoo| 精品国产理论片 | 天堂视频中文在线 | 黄网站污 | 综合国产在线观看 | 国产精品99爱 | 亚洲免费在线 | 婷婷六月色 | 91精品在线免费 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 国产综合精品久久 | 国产黄色大片 | 色婷婷狠狠五月综合天色拍 | 久久国产精品一国产精品 | 国产黄色观看 | 黄色激情网址 | 久久精品福利视频 | 奇米网网址 | 国产精品久久久久久久久久久久久 | 久久草视频 | av福利电影| 国产成人免费观看 | 国产免费美女 | 久久精品精品 | 国产亚洲免费的视频看 | 高清一区二区三区av | 国内久久久 | 午夜电影av | 99色亚洲 | 国产精品粉嫩 | 一区二区国产精品 | 日本精品久久久久 | 午夜精品剧场 | 伊人射| 亚洲影视资源 | av专区在线| 国产精品成人一区二区三区吃奶 | 久久96国产精品久久99软件 | 日本乱视频 | 在线观看黄色 | 久久久久久国产一区二区三区 | 丁香九月激情 | 亚洲国产美女久久久久 | 黄色大片视频网站 | 日韩欧美在线观看一区二区三区 | 五月激情六月丁香 | 色亚洲激情 | 国产一级二级视频 | 亚洲 欧美 变态 国产 另类 | 亚洲成人资源在线 | av手机版 | 国产午夜三级一区二区三桃花影视 | 丰满少妇对白在线偷拍 | 久久精品老司机 | 91精选在线观看 | 国产99一区 | 五月婷婷综合色拍 | 成人久久影院 | 91麻豆免费视频 | 色a在线观看 | 88av色 | 国产免费成人av | 精品日韩在线一区 | 精品视频中文字幕 | 国产福利网站 | 9在线观看免费高清完整版 玖玖爱免费视频 | 视频成人 | 91桃色免费观看 | 狠狠干.com| 亚洲精品视频在线观看免费视频 | 99热精品久久 | 免费福利片2019潦草影视午夜 | 四虎精品成人免费网站 | 黄色在线免费观看网址 | av在线免费观看不卡 | 国产高清av免费在线观看 | 在线婷婷| 久久99精品久久久久久秒播蜜臀 | 韩国精品福利一区二区三区 | 国内久久看 | 在线免费观看视频一区二区三区 | 久久tv| 中文字幕在线观看一区 | 久久综合久久八八 | 欧美精品在线一区二区 | 国产福利免费看 | 国产麻豆剧传媒免费观看 | 中文字幕高清免费日韩视频在线 | 国产第一页福利影院 | 在线亚州 | 中文字幕永久免费 | 色就色,综合激情 | 国语对白少妇爽91 | 日韩av资源在线观看 | 欧美一级欧美一级 | 欧美日韩一二三四区 | 成人在线播放视频 | 免费色视频网站 | 国产精品久久网站 | 中文字幕久久精品一区 | 国产精品粉嫩 | 中文字幕 婷婷 | 九色91福利 | 伊人狠狠色丁香婷婷综合 | 国产精品美 | 天天爽夜夜爽人人爽一区二区 | 五月天久久综合网 | 亚洲精品视频在线免费播放 | 美女黄频在线观看 | 国产精品自产拍在线观看蜜 | 日韩欧美精品在线 | 欧美精品在线视频观看 | 精品国产伦一区二区三区观看说明 | 色99视频| 91黄色在线看 | 久草在线在线精品观看 | 免费av在 | 在线观看免费国产小视频 | 国产裸体永久免费视频网站 | 中文字幕日韩免费视频 | 69精品 | 国产精品亚洲片在线播放 | 成年人看片网站 | 天天干,夜夜爽 | 精品国产视频在线观看 | 色综合网在线 | 久草a在线 | 久久精品中文字幕免费mv | 青青草久草在线 | 久久艹在线 | 午夜影视剧场 | 亚洲黄色在线观看 | 亚洲成av片人久久久 | 国产一级精品在线观看 | 亚洲欧美少妇 | 人人看黄色| 亚洲va韩国va欧美va精四季 | 999热线在线观看 | 98久久 | 欧美黑人巨大xxxxx | 中文欧美字幕免费 | 美女在线免费视频 | 亚洲黄网址| 91精品视频播放 | 91精品色| 久久亚洲人 | 手机成人在线 | 精品一区二区免费 | 日本精品二区 | 亚洲精品欧美专区 | 九九视频这里只有精品 | 亚洲激情网站免费观看 | adn—256中文在线观看 | 狠狠的日 | 亚洲视频播放 | 激情图片久久 | 久久草草热国产精品直播 | 日韩高清精品免费观看 | 狠狠色丁香婷婷综合橹88 | 九七在线视频 | 亚洲九九爱 | 夜夜高潮夜夜爽国产伦精品 | 亚洲国产一区在线观看 | 中文av不卡 | 在线观看免费视频 | 在线免费看片 | 最近免费中文字幕大全高清10 | 99国产在线| 五月天色站 | 欧美久久久一区二区三区 | 成人av久久 | 国产久草在线观看 | 成年人视频在线 | 欧美国产不卡 | 黄网站色视频 | 9999在线观看 | 国产精品男女 | 亚洲婷婷在线视频 | 日韩在线观看高清 | 国产精品久久久久四虎 | 日韩在线短视频 | 激情久久一区二区三区 | 91精品国产99久久久久久久 | 不卡视频在线看 | 久久午夜精品 | av网址aaa| 香蕉网址| 91激情 | 一级黄色片在线免费看 | 国产精品久久久久久久av大片 | 色鬼综合网 | 九九视频免费 | 色偷偷网站视频 | 日韩在线字幕 | 欧美黄色免费 | 亚洲久草网 | 亚洲精品乱码久久久久v最新版 | 美国av大片 | 五月婷婷在线视频观看 | 99麻豆久久久国产精品免费 | 久久综合五月婷婷 | 亚洲国产免费看 | 国产精品国产三级在线专区 | 免费观看黄 | 日韩在线视频一区 | 99久久免费看 | 人人干网站 | 国产精品theporn | 国产精品av免费在线观看 | 国产精久久久久久妇女av | 美女黄久久 | 三级视频日韩 | 午夜精品一区二区三区在线播放 | 一级黄色片在线 | 8x成人在线 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | av在线之家电影网站 | 免费成人黄色片 | 国产午夜精品一区二区三区 | 亚洲激色| 91爱爱中文字幕 | 国产麻豆精品在线观看 | 丰满少妇一级片 | 免费在线日韩 | 狠狠色噜噜狠狠狠狠2021天天 | 人人看人人艹 | 国产日韩欧美在线观看视频 | 久久久www成人免费毛片麻豆 | 天天曰天天 | 中文字幕影视 | 操操色| 精品一区二区电影 | 中文字幕久久网 | 欧美性生活一级片 | 国产美女永久免费 | 日本精品视频在线播放 | 日日操网 | 91精品国产91久久久久福利 | 日b视频国产 | 日韩在线在线 | 欧美视频国产视频 | 国产九九九精品视频 | 久久黄色免费观看 | 在线久热| 国产精品久久电影观看 | 亚洲日日夜夜 | 久久综合狠狠综合 | 国产精品理论片在线播放 | 四虎国产精品永久在线国在线 | 91av社区| 午夜久久久久久久久久久 | 久久精品欧美日韩精品 | 国产综合在线观看视频 | 久视频在线 | 国产美女搞久久 | 在线中文字母电影观看 | 久久视频二区 | 日本高清久久久 | 五月婷婷在线观看视频 | 久久视频国产精品免费视频在线 | 国产精品麻 | 免费观看xxxx9999片 | 免费黄色激情视频 | 中文字幕欧美日韩va免费视频 | 99热.com| 国产手机免费视频 | 深爱五月激情五月 | 97理论片| 美女天天操 | 狠狠操导航 | 午夜丁香网| 久久视频这里只有精品 | 国产资源站 | japanesefreesexvideo高潮 | 在线观看日本高清mv视频 | 国产午夜精品一区二区三区欧美 | 精品女同一区二区三区在线观看 | 亚洲激情视频在线观看 | 五月婷婷色丁香 | 免费视频你懂的 | 九九色在线观看 | 日本中文字幕久久 | www激情久久 | 午夜视频在线观看一区 | 97超碰国产在线 | 青春草免费视频 | 成人久久久久久久久久 | 狠狠干激情 | 国产中文字幕大全 | 日本乱码在线 | 国产亚洲午夜高清国产拍精品 | 操操日日 | 国产一级在线免费观看 | 国产精品手机在线播放 | 视频99爱| 日本在线中文在线 | bayu135国产精品视频 | 精品一二三区 | 久久久久国产精品午夜一区 | 成人三级网站在线观看 | 天天色婷婷 | 国产韩国精品一区二区三区 | 国产高清视频在线播放 | 国产最新在线 | 亚洲在线成人精品 | 久久精品久久精品 | 久久精品麻豆 | 日韩在线不卡视频 | 婷婷中文字幕综合 | 香蕉久草| 综合黄色网 | 国产精品久久99综合免费观看尤物 | 午夜久久视频 | 久久激情婷婷 | 成人作爱视频 | 美女视频免费一区二区 | 五月综合激情婷婷 | 中文字幕在线观看不卡 | 久久69精品 | 又黄又刺激 | 91热| 亚洲另类xxxx | 亚洲欧洲精品一区二区 | 久久久高清 | 9久久精品 | 亚洲视频在线播放 | 日韩精品视频第一页 | 欧美日韩国产一二三区 | 成人av影视在线 | 天天天在线综合网 | 亚洲伦理电影在线 | 国产精品a久久久久 | 久久精品99精品国产香蕉 | 91精品国产99久久久久久久 | 亚洲成人在线免费 | 少妇激情久久 | 久久精品国产亚洲精品2020 | 成人久久久精品国产乱码一区二区 | 国产码电影 | 久久综合婷婷 | 日韩欧美在线观看一区 | 久久久免费少妇 | 亚洲区精品 | 国产免费视频一区二区裸体 | 永久免费av在线播放 | 久久综合加勒比 | 国产精品国产三级国产aⅴ9色 | 中文字幕在线观看视频网站 | 亚洲精品2区| 亚洲成a人片在线观看网站口工 | 中文理论片 | 成人黄色资源 | 蜜臀精品久久久久久蜜臀 | 在线观看91精品国产网站 | 婷婷性综合 | 久久综合干 | 黄色小网站在线观看 | 欧美日韩中文在线观看 | 日韩精品在线视频免费观看 | 亚洲高清色综合 | 91色在线观看| 久久99精品国产91久久来源 | av久久久| 国产午夜精品一区二区三区在线观看 | 国产日韩在线一区 | 三级黄色理论片 | 国产在线理论片 | 91av视频网站 | 草久中文字幕 | 丁香花在线观看免费完整版视频 | 国内99视频 | 激情久久久 | 国产主播大尺度精品福利免费 | 亚洲成色777777在线观看影院 | 国产片免费在线观看视频 | 黄色国产成人 | 日本大片免费观看在线 | 国产精品久久久久久久久蜜臀 | 日日夜夜天天 | 日韩精品在线视频免费观看 | 欧美孕妇与黑人孕交 | 最新国产一区二区三区 | 色五月成人 | 国产v亚洲v| 日韩精品一区二区在线 | 国产裸体视频网站 | 国产精品免费看 | 成年人黄色免费网站 | 色资源二区在线视频 | 91最新地址永久入口 | 中文字幕一区二区在线播放 | 丁香亚洲 | 久久久久免费视频 | 黄色毛片电影 | 天堂av色婷婷一区二区三区 | 欧美韩日精品 | 激情六月婷婷久久 | 久久午夜电影 | 国产精品福利无圣光在线一区 | 亚洲成人黄色在线 | 91福利小视频 | wwwwww国产 | 中文网丁香综合网 | 在线观看免费一级片 | 日韩在线观看高清 | 丝袜美女视频网站 | 成人一级片免费看 | 欧美伦理电影一区二区 | 黄色aa久久 | 日韩中文字幕一区 | 亚洲区精品视频 | 伊人婷婷网 | 国产高清成人 | 日本中文字幕在线播放 | 91女人18片女毛片60分钟 | 欧美日韩伦理在线 | 国产精品网站 | 午夜狠狠干 | 在线岛国av | 日本成人中文字幕在线观看 | 九色精品免费永久在线 | 不卡视频一区二区三区 |