OpenJPA (4)

6 Query
6.1 JPQL Queries
6.1.1Query Basics

Java代码   收藏代码
  1. public Query createQuery(String jpql);  

    EntityManager上的这个方法用来根据给定的JPQL创建Query。

Java代码   收藏代码
  1. public List getResultList();  

   Query上的这个方法用来得到query的执行结果,以下是个简单的例子:

Java代码   收藏代码
  1. EntityManager em = entityManagerFactory.createEntityManager();   
  2. Query q = em.createQuery("SELECT x FROM Magazine x");  
  3. List<Magazine> results = (List<Magazine>) q.getResultList();  
  4. em.close();  

    JPQL query的from子句中定义了query内部命名空间。可以将任意的标识符赋值给entities,之后就可以在query的任意位置上通过标识符引用entities。 在from子句中,关键字as是可选的。例如以下两个JPQL等效:

Sql代码   收藏代码
  1. SELECT x FROM Magazine x   
  2. SELECT x FROM Magazine AS x  

    当查询entities的时候,关键字object也是可选的,例如select x 和 SELECT OBJECT(x) 是等效的。JPQL中的关键字不是大小写敏感的,而entity、identifier和member names是大小写敏感的。以下是一些JPQL的例子: 

Sql代码   收藏代码
  1. SELECT x FROM Magazine x WHERE x.TITLE = 'JDJ'  
  2. SELECT x FROM Magazine x WHERE x.title = 'JDJ' OR x.title = 'JavaPro'  
  3. SELECT x FROM Magazine x WHERE x.price > 3.00 AND x.price <= 5.00  
  4. SELECT x FROM Magazine x WHERE x.price <> 3.00  
  5. SELECT x FROM Magazine x WHERE (x.price > 3.00 AND x.price <= 5.00) OR x.price = 7.00  
  6. SELECT x FROM Magazine x WHERE x.price > 3.00 AND (x.price <= 5.00 OR x.price = 7.00)  
  7. SELECT x FROM Magazine x WHERE x.price >= 3.00 AND x.price <= 5.00  
  8. SELECT x FROM Magazine x WHERE x.price BETWEEN 3.00 AND 5.00  
  9. SELECT x FROM Magazine x WHERE x.title LIKE 'J%'  
  10. SELECT x FROM Magazine x WHERE x.title LIKE 'J__'  
  11. SELECT x FROM Magazine x WHERE x.title IN ('JDJ''JavaPro''IT Insider')  
  12. SELECT x FROM Magazine x WHERE x.articles is empty  
  13. SELECT x FROM Magazine x WHERE x.publisher is null  
  14. SELECT x FROM Magazine x WHERE NOT(x.price = 10.0)  

 

6.1.2 Relation Traversal
    可以通过类似Java的语法来遍历对象间的关系。例如Magazine中有个Publisher类型的属性publisher,那么可以通过以下方式编写JPQL query:

Sql代码   收藏代码
  1. SELECT x FROM Magazine x WHERE x.publisher.name = 'Random House'  

    以上的遍历中假设关系不是null。在SQL术语中类似于inner join。如果你希望包含为null 的关系,那么可以如下指定: 

Sql代码   收藏代码
  1. SELECT x FROM Magazine x WHERE x.publisher.name = 'Random House' or x.publisher is null  

    也可以在query中遍历集合字段,但是必须首先在from子句中定义遍历相关的identification variable,例如: 

Sql代码   收藏代码
  1. SELECT x FROM Magazine x, IN(x.articles) y WHERE y.authorName = 'John Doe'  

    IN() 类型的语法可以使用inner join关键词,例如以下两个JPQL等效: 

Sql代码   收藏代码
  1. SELECT x FROM Magazine x, IN(x.articles) y WHERE y.authorName = 'John Doe'   
  2. SELECT x FROM Magazine x inner join x.articles y WHERE y.authorName = 'John Doe'   

 

6.1.3 Fetch Joins
    JPQL query中可以指定一个或多个join fetch来指定哪些字段被pre-fetched,以5.6.1中的Publisher和Magazine为例:

Java代码   收藏代码
  1. em = entityManagerFactory.createEntityManager();  
  2. Query q2 = em.createQuery("SELECT x FROM Publisher x WHERE x.id = 1");  
  3. List<Publisher> r2 = (List<Publisher>)q2.getResultList();  
  4. em.close();  
  5. for(Iterator<Publisher> iter = r2.iterator(); iter.hasNext(); ) {  
  6.     System.out.println(iter.next().toString());  
  7. }  

    以上代码执行后的输出是:
    id: 1, name: publisher1, grade: null, magazines[]

Java代码   收藏代码
  1. em = entityManagerFactory.createEntityManager();  
  2. Query q3 = em.createQuery("SELECT x FROM Publisher x join fetch x.grade join fetch x.magazines WHERE x.id = 1");  
  3. List<Publisher> r3 = (List<Publisher>)q3.getResultList();  
  4. em.close();  
  5. for(Iterator<Publisher> iter = r3.iterator(); iter.hasNext(); ) {  
  6.     System.out.println(iter.next().toString());  
  7. }  

    以上代码执行后的输出是:
    id: 1, name: publisher1, grade: excellent, magazines[isbn: isbn1, title: title1; isbn: isbn1, title: title1; isbn: isbn2, title: title2; isbn: isbn2, title: title2]

 

6.1.4 JPQL Functions
    JPQL 支持一系列预定义的标量函数,例如:

Sql代码   收藏代码
  1. SELECT x FROM Magazine x WHERE CONCAT(x.title, 's') = 'JDJs'  
  2. SELECT x FROM Magazine x WHERE SUBSTRING(x.title, 1, 1) = 'J'  
  3. SELECT x FROM Magazine x WHERE TRIM(BOTH 'J' FROM x.title) = 'D'  
  4. SELECT x FROM Magazine x WHERE LOWER(x.title) = 'jdj'  
  5. SELECT x FROM Magazine x WHERE UPPER(x.title) = 'JAVAPRO'  
  6. SELECT x FROM Magazine x WHERE LENGTH(x.title) = 3  
  7. SELECT x FROM Magazine x WHERE LOCATE('D', x.title) = 2  
  8. SELECT x FROM Magazine x WHERE ABS(x.price) >= 5.00  
  9. SELECT x FROM Magazine x WHERE SQRT(x.price) >= 1.00  
  10. SELECT x FROM Magazine x WHERE MOD(x.price, 10) = 0  

 

6.1.5 Polymorphic Queries
    JPQL from子句中的entity class不仅包含这个类本身,而且还包含这个类及其子类。以下是个关于polymorphic query的简单例子:

Java代码   收藏代码
  1. @Entity  
  2. @Inheritance(strategy=InheritanceType.SINGLE_TABLE)  
  3. @DiscriminatorColumn(name="Class", discriminatorType=DiscriminatorType.STRING)  
  4. public abstract class BankingAccount {  
  5.     @Id  
  6.     @GeneratedValue(strategy = GenerationType.IDENTITY)  
  7.     protected int id;  
  8. }  
  9.   
  10. @Entity  
  11. @DiscriminatorValue("CC")  
  12. public class CreditCard extends BankingAccount {  
  13.     @Basic  
  14.     private BigInteger limitAmount;  
  15.   
  16.     public String toString() {  
  17.         StringBuffer sb = new StringBuffer();  
  18.         sb.append("credit card, limit amount: ").append(limitAmount);  
  19.         return sb.toString();  
  20.     }  
  21. }  
  22.   
  23. @Entity  
  24. @DiscriminatorValue("DC")  
  25. public class DebitCard extends BankingAccount {  
  26.     @Basic  
  27.     private BigInteger balanceAmount;  
  28.   
  29.     public String toString() {  
  30.         StringBuffer sb = new StringBuffer();  
  31.         sb.append("debit card, balance amount: ").append(balanceAmount);  
  32.         return sb.toString();  
  33.     }  
  34. }  

    假设目前数据库中的数据如下:

Sql代码   收藏代码
  1. select * from bankingaccount;  
  2. +----+-------+-------------+---------------+  
  3. | id | Class | limitAmount | balanceAmount |  
  4. +----+-------+-------------+---------------+  
  5. |  5 | CC    |        1000 |          NULL |  
  6. |  6 | DC    |        NULL |          2000 |  
  7. +----+-------+-------------+---------------+  

 

Java代码   收藏代码
  1. EntityManager em = entityManagerFactory.createEntityManager();  
  2. Query q1 = em.createQuery("SELECT x FROM BankingAccount x");  
  3. List<BankingAccount> r1 = (List<BankingAccount>)q1.getResultList();  
  4. for(Iterator<BankingAccount> iter = r1.iterator(); iter.hasNext(); ) {  
  5.     System.out.println(iter.next().toString());  
  6. }  
  7. em.close();  

    以上代码的执行结果如下:
    credit card, limit amount: 1000
    debit card, balance amount: 2000 

 

6.1.6 Query Parameters
    JPQL支持两种类型的query参数:named parameters 或 positional parameters。在一个JPQL query中不能同时使用两种类型的参数。以下是两个简单的例子:

Java代码   收藏代码
  1. Query q = em.createQuery("SELECT x FROM Magazine x WHERE x.title = ?1 and x.price > ?2");  
  2. q.setParameter(1"JDJ").setParameter(25.0);  
  3. List<Magazine> results = (List<Magazine>) q.getResultList();  
  4.   
  5. Query q = em.createQuery("SELECT x FROM Magazine x WHERE x.title = :titleParam and x.price > :priceParam");  
  6. q.setParameter("titleParam""JDJ").setParameter("priceParam"5.0);  
  7. List<Magazine> results = (List<Magazine>) q.getResultList();  

 

6.1.7 Query Hints
    JPQL支持通过name/value对来指定query hints。例如:

Java代码   收藏代码
  1. Query q = em.createQuery("select m from Magazine m where ... ");  
  2. q.setHint("openjpa.hint.OptimizeResultCount"new Integer(2));  
  3. q.setHint("openjpa.FetchPlan.ReadLockMode","WRITE");  
  4. List r = q.getResultList();  

 

6.1.8 Ordering 
    JPQL支持根据一个或者多个字段对查询结果进行排序,例如:

Sql代码   收藏代码
  1. SELECT x FROM Magazine x order by x.title asc, x.price desc  

 

6.1.9 Aggregates 
    JPQL支持min、max、avg和count等聚集函数(也被称为列函数)。以下是一些例子:

Java代码   收藏代码
  1. Query q = em.createQuery("SELECT AVG(x.price) FROM Magazine x");  
  2. Query q = em.createQuery("SELECT SUM(DISTINCT x.price) FROM Magazine x");  
  3. Query q = em.createQuery("SELECT MAX(x.price) FROM Magazine x WHERE x.title = 'JDJ'");  

 

6.1.10 Named Queries
    JPQL支持通过NamedQuery 和NamedQueries 这两个annotation来声明命名query。以下是一个例子:

Java代码   收藏代码
  1. @Entity  
  2. @NamedQueries({  
  3.     @NamedQuery(name="magsOverPrice",  
  4.         query="SELECT x FROM Magazine x WHERE x.price > ?1"),  
  5.     @NamedQuery(name="magsByTitle",  
  6.         query="SELECT x FROM Magazine x WHERE x.title = :titleParam")  
  7. })  
  8. public class Magazine {  
  9.     ...  
  10. }  
  11.   
  12. Query q = em.createNamedQuery("magsOverPrice");  
  13. q.setParameter(15.0f);  
  14. List<Magazine> results = (List<Magazine>) q.getResultList();  
  15.   
  16. Query q = em.createNamedQuery("magsByTitle");  
  17. q.setParameter("titleParam""JDJ");  
  18. List<Magazine> results = (List<Magazine>) q.getResultList();  

 

6.1.11 Delete By Query
    Query可以用来高效地删除对象(不必将每个对象查询之后再进行删除,而是直接进行批量删除)。以下是个简单的例子:

Java代码   收藏代码
  1. Query q = em.createQuery("DELETE FROM Subscription s WHERE s.subscriptionDate < :today");  
  2. q.setParameter("today"new Date());  
  3. int deleted = q.executeUpdate();  

    executeUpdate方法的返回值是删除对象的个数。 

 

6.1.12 Update By Query
    跟delete类似,Query也可以用来高效地更新对象。以下是个简单的例子:

Java代码   收藏代码
  1. Query q = em.createQuery("UPDATE Subscription s SET s.paid = :paid WHERE s.subscriptionDate < :today");  
  2. q.setParameter("today"new Date());  
  3. q.setParameter("paid"true);  
  4. int updated = q.executeUpdate();   

 

6.1.13 Subquery
    目前JPA规范支持在WHERE子句和HAVING子句中使用子查询,未来可能会支持FROM子句中使用子查询。以下是一些例子:

Sql代码   收藏代码
  1. SELECT DISTINCT auth FROM Author auth WHERE EXISTS (SELECT spouseAuthor FROM Author spouseAuthor WHERE spouseAuthor = auth.spouse)  
  2. SELECT auth FROM Author auth WHERE auth.salary >= ALL(SELECT a.salary FROM Author a WHERE a.magazine = auth.magazine)  
  3. SELECT goodPublisher FROM Publisher goodPublisher WHERE goodPublisher.revenue < (SELECT AVG(p.revenue) FROM Publisher p)  
  4. SELECT mag FROM Magazine mag WHERE (SELECT COUNT(art) FROM mag.articles art) > 10  

 

6.1.14 JPQL Constructor Expressions
    在SELECT子句中可以通过使用constructor来返回一个或多个实例。指定的类不必是entity class,例如:

Sql代码   收藏代码
  1. SELECT NEW com.company.PublisherInfo(pub.id, pub.revenue, mag.price) FROM Publisher pub JOIN pub.magazines mag WHERE mag.price > 5.00  

 

6.2 SQL Queries
    JPA支持通过Query接口的以下两个方法使用SQL查询:

Java代码   收藏代码
  1. public Query createNativeQuery(String sqlString, Class resultClass);  
  2. public Query createNativeQuery(String sqlString, String resultSetMapping);  

   OpenJPA也支持使用存储过程。OpenJPA假定任何不以SELECT开头的SQL为存储过程的调用。

 

   在指定resultClass的情况下,sqlString必须查询指定resultClass的 primary key 列、 discriminator 列 (如果存在) 和version column (如果存在)。JPA使用以上三个列的信息来判断object identity、区分查询子类和检查并发修改。 以下是个简单的例子:

Java代码   收藏代码
  1. Query query = em.createNativeQuery("SELECT isbn, title, price, vers FROM Magazine WHERE price > 5 AND price < 10", Magazine.class);  
  2. List<Magazine> results = (List<Magazine>) query.getResultList();  
  3. for (Magazine mag : results)  
  4.     processMagazine(mag);  
 

   在指定resultSetMapping的情况下,resultSetMapping引用一个定义好的SqlResultSetMapping,例如:

Java代码   收藏代码
  1. @Entity  
  2. @SqlResultSetMapping(name="srsm1",  
  3.     entities={@EntityResult(entityClass=Publisher.class),  
  4.               @EntityResult(entityClass=Magazine.class)}  
  5. )  
  6. public class Publisher {  
  7.     …  
  8. }  
  9.   
  10. EntityManager em = entityManagerFactory.createEntityManager();  
  11. Query q13 = em.createNativeQuery("SELECT p.id, p.name, m.isbn, m.title FROM Publisher AS p, Magazine as m WHERE p.id = 1 AND p.id = m.publisherId""srsm1");  
  12. List r13 = q13.getResultList();  
  13. em.close();  
  14. for(Iterator iter = r13.iterator(); iter.hasNext(); ) {  
  15.     Object objects[] = (Object[])iter.next();  
  16.     System.out.println("publisher: " + objects[0] + ", magazine: " + objects[1]);  
  17. }  
 

   当查询结果不仅包含entity,而且包含value type的时候,可以在SqlResultSetMapping中指定@ColumnResult,例如:

Java代码   收藏代码
  1. @Entity  
  2. @SqlResultSetMapping(name="srsm2",  
  3.     entities={@EntityResult(entityClass=Publisher.class)},  
  4.         columns={@ColumnResult(name="count")}  
  5. )  
  6. public class Publisher {  
  7.     …  
  8. }  
  9.   
  10. EntityManager em = entityManagerFactory.createEntityManager();  
  11. Query q14 = em.createNativeQuery("SELECT p.id, count(*) AS count FROM Publisher AS p LEFT JOIN Magazine as m ON p.id = m.publisherId GROUP BY p.id""srsm2");  
  12. List r14 = q14.getResultList();  
  13. em.close();  
  14. for(Iterator iter = r14.iterator(); iter.hasNext(); ) {  
  15.     Object objects[] = (Object[])iter.next();  
  16.     System.out.println("publisher: " + objects[0] + ", count: " + objects[1]);  
  17. }  
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值