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

这一部分是该系列文章的第一部分 。

JPA:NamedQuery,使用日期查询,有关getSingleResult方法的警告

为了避免重复查询代码,提高性能并简化维护查询,我们可以使用NamedQueries。 NamedQuery使用JPQL作为语法,并在实体类中声明。 类代码更新后,更容易编辑查询。

如果要使用日期作为参数进行查询,则只能发送日期对象,也可以传递描述日期类型的枚举(推荐)。

在下面,您将看到如何创建和使用@NamedQuery以及如何使用日期查询:

package com.model;import java.util.Date;import javax.persistence.*;@Entity
@NamedQuery(name='Dog.FindByDateOfBirth', query='select d from Dog d where d.dateOfBirth = :dateOfBirth')
public class Dog {public static final String FIND_BY_DATE_OF_BIRTH = 'Dog.FindByDateOfBirth';@Id@GeneratedValue(strategy = GenerationType.AUTO)private int id;// get and set
}
package com.model;import java.util.*;import javax.persistence.*;@Entity
@NamedQueries({@NamedQuery(name='Person.findByName', query='select p from Person p where p.name = :name'),@NamedQuery(name='Person.findByAge', query='select p from Person p where p.age = :age')})
})
public class Person {public static final String FIND_BY_NAME = 'Person.findByName';public static final String FIND_BY_AGE = 'Person.findByAge';@Id@GeneratedValue(strategy = GenerationType.AUTO)private int id;// get and set}
package com.main;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.TemporalType;import com.model.Dog;
import com.model.Person;public class Page07 {public static void main(String[] args) {CodeGenerator.startConnection();CodeGenerator.generateData();EntityManager em = CodeGenerator.getEntityManager();int age = 70;List<Person> personByAge = getPersonByAge(em, 70);System.out.println('Found ' + personByAge.size() + ' person(s) with the age of: ' + age);SimpleDateFormat formatter = new SimpleDateFormat('dd/MM/yyyy');Date dateOfBirth = null;try {dateOfBirth = formatter.parse('10/1/1995');} catch (ParseException e) {e.printStackTrace();}List<Dog> dogsByDayOfBirth = getDogsByDayOfBirth(em, dateOfBirth);System.out.println('Found ' + dogsByDayOfBirth.size() + ' dog with birth date of ' + formatter.format(dateOfBirth));/** This queries will raise Runtime Exceptions** em.createQuery('select p from Person p').getSingleResult(); // NonUniqueResultException** em.createQuery('select p from Person p where p.name = 'JJJJ'').getSingleResult(); //NoResultException*/CodeGenerator.closeConnection();}@SuppressWarnings('unchecked')private static List<Dog> getDogsByDayOfBirth(EntityManager em, Date dateOfBirth) {Query query = em.createNamedQuery(Dog.FIND_BY_DATE_OF_BIRTH);query.setParameter('dateOfBirth', dateOfBirth, TemporalType.DATE);return query.getResultList();}@SuppressWarnings('unchecked')private static List<Person> getPersonByAge(EntityManager em, int age) {Query query = em.createNamedQuery(Person.FIND_BY_AGE);query.setParameter('age', age);return query.getResultList();}
}

关于上面的代码:

  • 如果只有一个查询,则可以使用@NamedQuery注释; 如果您有多个查询,则可以使用@NamedQueries批注。
  • 使用日期对象进行查询时,还可以使用TemporalType枚举来详细说明日期的类型。 对于日期查询,可以使用“ java.util.Date ”或“ java.util.GregorianCalendar ”。

getSingleResult()

使用此方法时要小心。 它有一种特殊的方式来处理很容易发生的两种行为,并且两种行为都会引发异常:

  • 从查询结果中查找多个对象: NonUniqueResultException
  • 找不到结果: NoResultException

您始终需要使用try / catch以避免在生产环境中引发这些异常。

如果要实时查看此异常,则在上面的代码中可以找到两个带注释的查询。 它将引发以下异常:

Exception in thread 'main' <span style='text-decoration: underline;'>javax.persistence.NonUniqueResultException</span>: result returns more than one elements
at org.hibernate.ejb.QueryImpl.getSingleResult(<span style='text-decoration: underline;'>QueryImpl.java:287</span>)
Exception in thread 'main' <span style='text-decoration: underline;'>javax.persistence.NoResultException</span>: No entity found for query
at org.hibernate.ejb.QueryImpl.getSingleResult(<span style='text-decoration: underline;'>QueryImpl.java:280</span>)

JPA:NativeQuery,名为NativeQuery

JPA使用的JPQL没有任何特定于数据库的功能。 当JPQL仅提供数据库之间的公用功能时,如何进行查询以调用特定的数据库功能?

从人员p中选择p,其中p.name〜*:name ”该查询语法是对Postgres数据库的有效查询; 如果您尝试使用NamedQuery(使用JPQL)运行此查询,则会看到以下异常:

<strong><em>ERROR SessionFactoryImpl:422 - Error in named query: Person.FindByName</em></strong>
<strong><em>org.hibernate.QueryException: unexpected char: '~' [select p from com.model.Person p where p.name ~* :name]</em></strong>
<strong><em>at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:229)</em></strong>
<strong><em>at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)</em></strong>
<strong><em>at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)</em></strong>
<strong><em>at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)</em></strong>
<strong><em>at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:124)</em></strong>
<strong><em>at org.hibernate.impl.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:547)</em></strong>
<strong><em>at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:411)</em></strong>
<strong><em>at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1842)</em></strong>
<strong><em>at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:902)</em></strong>
<strong><em>at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:57)</em></strong>
<strong><em>at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)</em></strong>
<strong><em>at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)</em></strong>
<strong><em>at com.main.CodeGenerator.startConnection(CodeGenerator.java:27)</em></strong>
<strong><em>at com.main.Page05.main(Page05.java:12)</em></strong>
<strong><em>Exception in thread “main” javax.persistence.PersistenceException: [PersistenceUnit: JpaQuery] Unable to build EntityManagerFactory</em></strong>
<strong><em>at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:911)</em></strong>
<strong><em>at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:57)</em></strong>
<strong><em>at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)</em></strong>
<strong><em>at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)</em></strong>
<strong><em>at com.main.CodeGenerator.startConnection(CodeGenerator.java:27)</em></strong>
<strong><em>at com.main.Page05.main(Page05.java:12)</em></strong>
<strong><em>Caused by: org.hibernate.HibernateException: Errors in named queries: Person.FindByName</em></strong>
<strong><em>at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:424)</em></strong>
<strong><em>at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1842)</em></strong><strong><em> </em></strong>
<strong><em>at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:902)</em></strong>
<strong><em> ... 5 more</em></strong>

解决这种情况的方法是使用不使用JPQL作为其语法的查询。 使用NativeQuery,您将能够使用数据库语法进行查询。

您可以在下面的代码中看到如何使用NativeQueries:

package com.main;import javax.persistence.EntityManager;
import javax.persistence.Query;import com.model.Dog;public class Page08 {public static void main(String[] args) {CodeGenerator.startConnection();CodeGenerator.generateData();EntityManager em = CodeGenerator.getEntityManager();String nameOfFirstPerson = getFirstPersonName(em);System.out.println(nameOfFirstPerson);Dog dog = getTopDogDescending(em);System.out.println(dog.getName());CodeGenerator.closeConnection();}/*** Returns the name of the first person using a native sql*/private static String getFirstPersonName(EntityManager em) {Query query = em.createNativeQuery('select top 1 name from person');return (String) query.getSingleResult();}/*** Return an object using a native sql*/private static Dog getTopDogDescending(EntityManager em) {Query query = em.createNativeQuery('select top 1 id, name, weight from dog order by id desc', Dog.class);return (Dog) query.getSingleResult();}
}

关于上面的代码:

  • 请注意,我们使用本机查询代替JPQL。 作为本地查询的结果,我们可以有一个实体。 方法“ getTopDogDescending ”在本机查询调用之后返回Dog对象。

您还可以将本地查询创建为@NamedNativeQuery。 NamedNativeQuery和NativeQuery之间的区别在于NamedNativeQuery是在其实体类上定义的,并且您只能使用该名称类。

使用@NamedNativeQuery的优点是:

  • 易于维护的代码:每个查询都在该类上,如果一个类更新属性,则更新查询将变得更加容易。
  • 帮助提高性能:声明查询后,JPA将对其进行映射并将其语法保留在内存中。 JPA不需要在项目每次使用时都“解析”您的查询。
  • 提高代码重用性:声明@NamedNativeQuery后,必须为“ name”参数提供一个值,并且该名称对于Persistence Unit范围必须是唯一的(您在“ persistence.xml”中设置此值,并由EntityManager)。

您将在下面看到如何声明@NamedNativeQuery:

package com.model;import java.util.*;import javax.persistence.*;@Entity
@NamedQueries({@NamedQuery(name='Person.findByName', query='select p from Person p where p.name = :name'),@NamedQuery(name='Person.findByAge', query='select p from Person p where p.age = :age')
})@NamedNativeQuery(name='Person.findByNameNative', query='select id, name, age from person where name = :name')
public class Person {public static final String FIND_BY_NAME = 'Person.findByName';public static final String FIND_BY_AGE = 'Person.findByAge';@Id@GeneratedValue(strategy = GenerationType.AUTO)private int id;// get and set
}

您将可以使用@NamedNativeQuery,就像@NativeQuery一样: em.createNamedQuery(“ Person.findByNameNative”); ”。

这里有一些坏消息。 不幸的是,Hibernate尚未实现@NamedNativeQuery。 如果您尝试使用此批注运行代码,则会看到以下异常:

<em>Caused by: <span style='text-decoration: underline;'>org.hibernate.cfg.NotYetImplementedException</span>: Pure native scalar queries are not yet supported</em>
<em>at org.hibernate.cfg.annotations.QueryBinder.bindNativeQuery(<span style='text-decoration: underline;'>QueryBinder.java:140</span>)</em>
<em>at org.hibernate.cfg.AnnotationBinder.bindQueries(<span style='text-decoration: underline;'>AnnotationBinder.java:339</span>)</em>
<em>at org.hibernate.cfg.AnnotationBinder.bindClass(<span style='text-decoration: underline;'>AnnotationBinder.java:548</span>)</em>
<em>at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(<span style='text-decoration: underline;'>Configuration.java:3977</span>)</em>
<em>at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(<span style='text-decoration: underline;'>Configuration.java:3931</span>)</em>
<em>at org.hibernate.cfg.Configuration.secondPassCompile(<span style='text-decoration: underline;'>Configuration.java:1368</span>)</em>
<em>at org.hibernate.cfg.Configuration.buildMappings(<span style='text-decoration: underline;'>Configuration.java:1345</span>)</em>
<em>at org.hibernate.ejb.Ejb3Configuration.buildMappings(<span style='text-decoration: underline;'>Ejb3Configuration.java:1477</span>)</em>
<em>at org.hibernate.ejb.EventListenerConfigurator.configure(<span style='text-decoration: underline;'>EventListenerConfigurator.java:193</span>)</em>
<em>at org.hibernate.ejb.Ejb3Configuration.configure(<span style='text-decoration: underline;'>Ejb3Configuration.java:1096</span>)</em>
<em>at org.hibernate.ejb.Ejb3Configuration.configure(<span style='text-decoration: underline;'>Ejb3Configuration.java:278</span>)</em>
<em>at org.hibernate.ejb.Ejb3Configuration.configure(<span style='text-decoration: underline;'>Ejb3Configuration.java:362</span>)</em>

JPA:复杂的本地查询

您将能够创建映射到NativeQuery的复合体。 此映射将返回多个类或值。

您可以在下面看到我们的类如何映射此复杂结果以及如何使用它执行查询:

package com.model;import java.util.*;import javax.persistence.*;@Entity
@NamedQueries({@NamedQuery(name='Person.findByName', query='select p from Person p where p.name = :name'),@NamedQuery(name='Person.findByAge', query='select p from Person p where p.age = :age')})
})
@SqlResultSetMappings({@SqlResultSetMapping(name='personAndAdress',entities={@EntityResult(entityClass=Person.class),@EntityResult(entityClass=Address.class,fields={@FieldResult(name='id', column='ADDRESS_ID')})}),@SqlResultSetMapping(name='personWithDogAmount',entities={@EntityResult(entityClass=Person.class)},columns={@ColumnResult(name='dogAmount')})
})
public class Person {public static final String FIND_BY_NAME = 'Person.findByName';public static final String FIND_BY_AGE = 'Person.findByAge';public static final String MAPPING_PERSON_AND_ADDRESS = 'personAndAdress';public static final String MAPPING_DOG_AMOUNT = 'personWithDogAmount';@Id@GeneratedValue(strategy = GenerationType.AUTO)private int id;// get and set
}
package com.main;import java.math.BigInteger;import javax.persistence.EntityManager;
import javax.persistence.Query;import com.model.Address;
import com.model.Person;public class Page09 {public static void main(String[] args) {CodeGenerator.startConnection();CodeGenerator.generateData();EntityManager em = CodeGenerator.getEntityManager();Query query = em.createNativeQuery('select id, name, age, a.id as ADDRESS_ID, houseNumber, streetName ' +'from person p join address a on a.id = p.address_id where p.id = 1',Person.MAPPING_PERSON_AND_ADDRESS);Object[] result = (Object[]) query.getSingleResult();Person personWithAdress = (Person) result[0];Address address = (Address) result[1];System.out.println(personWithAdress.getName() + ' lives at ' + address.getStreetName());query = em.createNativeQuery('select p.id, p.name, count(0) as dogAmount ' +'from person p join dog d on p.id = d.person_id where name = 'Mark' ' +'group by p.id, p.name',Person.MAPPING_DOG_AMOUNT);result = (Object[]) query.getSingleResult();Person person = (Person) result[0];BigInteger total = (BigInteger) result[1];System.out.println(person.getName() + ' has ' + total + ' dogs');CodeGenerator.closeConnection();}
}

关于上面的代码:

  • 使用“ @SqlResultSetMapping ”,您将通知JPA我们想要哪个实体作为结果。 注意,在映射“ personAndAdress ”中,我们编写了将返回的类。 我们还使用了一个名为“ @FieldResult ”的属性。 此属性将映射具有相同名称的查询字段,在我们的查询中,我们获得了人员ID和地址ID。 这就是为什么我们使用“ @FieldResult ”来通知JPA将列ADDRESS_ID映射到Address类的ID属性的原因。
  • 在“ dogAmount ”映射中,我们设置“ @ColumnResult”属性,该属性通知JPA我们将在查询结果中包含一个“ 额外的列 ”,而该“ 额外的列 ”不属于任何类。

JPA:使用EJB优化查询

每当您在事务范围内执行查询时,持久性上下文将使结果保持“ 附加 ”状态。 持久性上下文将“ 监视 ”该对象,以防万一该“ 附加 ”对象中的任何对象收到任何更新。 所有“ 附加的 ”对象更新都将保留在数据库中。

@PersistenceContext(unitName = 'myPU')
private EntityManager em;@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void editPersonName(Integer personId, String personNewName){Person person = em.find(Person.class, personId);person.setName(personNewName);
}

您可以在上面的代码中看到我们不需要调用“ em.merge() ”来更新数据库中的人名。

当我们从数据库中带来一个通常显示在数据表或报表上的集合时,所有这些对象都将附加到持久性上下文中。 制作此对象的过程将触发多个过程,数据验证和同步。 当对象数越高时,分配给查询结果的内存就越高,而保持所有这些对象“ 附加 ”的持久性上下文的工作就越高。

将所有这些对象的最终目的地发送到视图时,将所有这些对象“附加”起来有什么意义? 当对象离开EJB项目并转到视图项目时,它们将被视为“分离的”。 在这种情况下,我们无需进行不必要的工作即可从数据库中获取所有数据,进行make(而不是“附加”)并将其发送到视图以使其“分离”。

有一种简单的方法可以使这些对象来自已经分离的数据库。 这种方法的优势在于,持久性上下文永远不会浪费时间,容器处理器会尝试同步查询结果。

您可以在下面的代码中看到此解决方案的工作方式。

package com.main;import java.util.List;import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;import com.model.Person;@Stateless
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class PersonDAO {@PersistenceContext(unitName = 'myPU')private EntityManager em;@TransactionAttribute(TransactionAttributeType.REQUIRED)public void editPersonName(Integer personId, String personNewName){Person person = em.find(Person.class, personId);person.setName(personNewName);}@SuppressWarnings('unchecked')public List<Person> listAll(){Query query = em.createQuery('select p from Person p');return query.getResultList();}@SuppressWarnings('unchecked')public List<Person> listAllWithoutDogs(){Query query = em.createQuery('select p from Person p where p.dogs is empty');return query.getResultList();}
}

在上面的代码中,我们获得了一个DAO类,即EJB。 默认情况下,我们的EJB缺少事务(“ @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) ”),使用这种事务,持久性上下文将不会“ 附加 ”查询结果。 查询返回的对象将被视为“ 分离 ”。

请注意,方法“ editPersonName ”的注释仍然相同:“ @TransactionAttribute(TransactionAttributeType.REQUIRED) ”。 这种事务向EJB指示如果尚未启动任何新事务,则应启动一个新事务。 您可以为该类设置事务属性,但是方法可以覆盖此属性,就像我们在“ editPersonName ”中所做的一样 。 方法事务定义将优先于类事务定义。

JPA:分页

如果要进行JPA分页,请像下面的方法一样:

package com.main;import java.util.List;import javax.persistence.EntityManager;
import javax.persistence.Query;import com.model.Dog;public class Page11 {@SuppressWarnings('unchecked')public static void main(String[] args) {CodeGenerator.startConnection();CodeGenerator.generateData();EntityManager em = CodeGenerator.getEntityManager();Query query = em.createQuery('select d from Dog d');List<Dog> dogs = query.getResultList();System.out.println('Total of dogs found: ' + dogs.size());query.setMaxResults(5);query.setFirstResult(0);List<Dog> fiveFirstDogs = query.getResultList();System.out.print('Total of dogs found: ' + fiveFirstDogs.size() + ' ');for (Dog dog : fiveFirstDogs) {System.out.print(dog.getName() + ' ');}System.out.println();query.setMaxResults(5);query.setFirstResult(5);List<Dog> fiveSecondDogs = query.getResultList();System.out.print('Total of dogs found: ' + fiveSecondDogs.size() + ' ');for (Dog dog : fiveSecondDogs) {System.out.print(dog.getName() + ' ');}CodeGenerator.closeConnection();}
}

关于上面的代码:

  • 方法“ setMaxResults ”将设置查询将返回的结果量。
  • 方法“ setFirstResult ”将设置将要带来的第一行。

在第一个查询中,我们搜索了数据库中的所有数据。

在第二个查询中,我们从位置0开始获得了五个结果。

在上一个查询中,我们再次获得了五个结果,但是从位置5开始。

请记住,第一个位置始终为零而不是一个。

JPA:数据库提示

数据库供应商向我们提供了名为“提示”的特定功能。 这些提示非常有用,因为它们可以优化查询并帮助我们完成其他任务。 每个数据库都有自己的提示,并且这些值不可移植。

在下面,您可以看到一些提示:

  • SQLServer:OPTION(OPTIMIZE FOR(@name ='Mark',@age UNKNOWN));
  • Oracle:选择/ * + first_rows(100)* /名称
  • MySQL:从人忽略索引中选择*(col3_index)

每个数据库供应商都将规则设置为其提示,诸如语法和执行命令之类的规则。

有两种定义提示的方法:

package com.main;import java.util.List;import javax.persistence.EntityManager;
import javax.persistence.Query;import com.model.Dog;public class Page12 {@SuppressWarnings('unchecked')public static void main(String[] args) {CodeGenerator.startConnection();CodeGenerator.generateData();EntityManager em = CodeGenerator.getEntityManager();Query query = em.createQuery('select d from Dog d');query.setHint('org.hibernate.timeout', 1000);List<Dog> dogs = query.getResultList();System.out.println('Found ' + dogs.size() + ' dogs');CodeGenerator.closeConnection();}
}
package com.model;import java.util.*;import javax.persistence.*;@Entity
@NamedQueries({@NamedQuery(name='Person.findByName', query='select p from Person p where p.name = :name'),@NamedQuery(name='Person.findByAge', query='select p from Person p where p.age = :age', hints={@QueryHint(name='org.hibernate.timeout', value='1000')})
})
@SqlResultSetMappings({@SqlResultSetMapping(name='personAndAdress',entities={@EntityResult(entityClass=Person.class),@EntityResult(entityClass=Address.class,fields={@FieldResult(name='id', column='ADDRESS_ID')})}),@SqlResultSetMapping(name='personWithDogAmount',entities={@EntityResult(entityClass=Person.class)},columns={@ColumnResult(name='dogAmount')})
})
public class Person {public static final String FIND_BY_NAME = 'Person.findByName';public static final String FIND_BY_AGE = 'Person.findByAge';public static final String MAPPING_PERSON_AND_ADDRESS = 'personAndAdress';public static final String MAPPING_DOG_AMOUNT = 'personWithDogAmount';@Id@GeneratedValue(strategy = GenerationType.AUTO)private int id;// get and set
}

您可以在@NamedQuery和直接在查询中设置提示。

您必须始终记住提示的缺点 。 在NamedQuery上设置提示后,您的代码将无法移植到其他数据库供应商。 一种解决方案是仅使用查询而不是NamedQuery。 在将提示添加到查询之前,您可以检查当前数据库是否支持该提示。 您可以使用属性文件来定义应用程序的当前数据库。

继续本系列的第三部分

参考: uaiHebert博客上来自JCG合作伙伴 Hebert Coelho的JPA查询和技巧 。


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

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

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

相关文章

设置UITableView设置contentsize

由于UITableView是继承自UIScrollView的&#xff0c;所以他是可以设置contentsize的。 但是&#xff0c;我在试验的过程中&#xff0c;初始化UITableView实例后&#xff0c;直接设置它的contentsize是不起作用&#xff0c;在搜寻相关资料得知&#xff0c;UITableView会自动设置…

java 线程什么时候结束_java线程什么时候让出cpu?

Thread.sleep();sleep就是正在执行的线程主动让出cpu&#xff0c;cpu去执行其他线程&#xff0c;在sleep指定的时间过后&#xff0c;cpu才会回到这个线程上继续往下执行&#xff0c;如果当前线程进入了同步锁&#xff0c;sleep方法并不会释放锁&#xff0c;即使当前线程使用sle…

Hibernate配置方式

Hibernate配置方式 Hibernate给人的感受是灵活的&#xff0c;要达到同一个目的&#xff0c;我们可以使用几种不同的办法。就拿Hibernate配置来说&#xff0c;常用的有如下三种方式&#xff0c;任选其一。 在 hibernate.cfg.xml 中加入元素 <property>、<mapping>&a…

js中 javascript:void(0) 用法详解

javascript:void(0)表示不做任何动作。如&#xff1a; 复制代码代码如下:<a href"javascript:void(0);" οnclick"alert(ok);"></a> 这里表示这个链接不做跳转动作&#xff0c;执行onClick事件。 我想使用过ajax的都常见这样的代码&#xff1…

带有ActiveMQ的JMS

带有ActiveMQ的JMS JMS是Java Message Service的缩写&#xff0c;它提供了一种以松散耦合&#xff0c;灵活的方式集成应用程序的机制。 JMS以存储和转发的方式跨应用程序异步传递数据。 应用程序通过充当中介的MOM&#xff08;面向消息的中间件&#xff09;进行通信&#xff0c…

矩阵分解 java_使用矩阵分解为推荐系统

矩阵分解假设“潜在因素”&#xff0c;例如对用户的意大利食物的偏好和项目食物的意外性与矩阵中的评级有关 .因此&#xff0c;整个问题类型转变为矩阵重构问题&#xff0c;存在许多不同的解决方案 . 一个简单的&#xff0c;可能很慢的解决方案是(除了ALS和其他一些矩阵重建的可…

用户故事排球教练助手

计划&#xff1a;估计这个任务需要一周时间 需求分析&#xff1a;作为一名排球教练助手&#xff0c;我需要了解每场每位队员的技术动作&#xff0c;每场比赛每位队员的得分情况&#xff0c;以便教练更好的了解到每位队员的发挥情况和特长。 设计文档&#xff1a;用户进入此界面…

TMS320DM642学习----第一篇(硬件连接)

DSP设备型号&#xff1a;SEED-DTK-VPM642&#xff08;目前实验室用途&#xff1a;视频处理&#xff0c;图像处理方向&#xff0c;预计搭载目标跟踪以及云台防抖等算法&#xff09; 官网链接&#xff1a;http://www.seeddsp.com/index.php/Home/Product/detail/name/1/id/174.ht…

字符串内存内部

本文基于我对StackOverflow的回答 。 我正在尝试解释String类如何存储文本&#xff0c;内部存储和常量池如何工作。 这里要理解的要点是String Java对象与其内容– private value字段下的char[]之间的区别。 String基本上是char[]数组的包装器&#xff0c;将其封装并使其无法修…

关于inline-block 元素之间为何会产生间隔

关于inline-block 元素之间为何会产生间隔 现象&#xff1a; <body><input type"text"><input type"text"> </body> 在浏览器中的表现&#xff1a; 实时上不仅仅是 inline-block 会导致这种现象。 inline 也会导致。 那问题来了&a…

java 入参 是 枚举_java 枚举 参数传递

展开全部这样做是不行的&#xff0c;原因是&#xff1a;Java中的对象实例化都是在堆中&#xff0c;如果是普通的类实例变量&#xff0c;比如在方法636f707962616964757a686964616f313333376166371中定义的普通类实例变量&#xff0c;传到了方法2中&#xff0c;由于方法1和方法2…

loadView的使用总结

一、loadView 1. loadView什么时候被调用&#xff1f; 每次访问UIViewController的view&#xff08;如 controller.view、self.view&#xff09;并且view为nil&#xff0c;loadView方法就会被调用 2. 有什么作用 loadView 方法是用来负责创建UIViewController的view 3. 默认实…

数据库备份 java jar_Java实现数据库备份并利用ant导入SQL脚本

​数据备份对于经常在运维部署方面的工作者来说&#xff0c;是一件相对简单的事情&#xff0c;都可以通过某一个SQL工具进行备份&#xff0c;但是如果在项目运行当中&#xff0c;我们需要对数据进行实时&#xff0c;或者是每隔一星期&#xff0c;一个月&#xff0c;等等进行数据…

JSF简单Ajax示例

今天&#xff0c;我们将看到一些使用JSF的Ajax简单样本。 如果要查看有关JSF / Web应用程序的其他文章&#xff0c;请单击以下链接&#xff1a; 重定向后的JSF持久化对象和消息 &#xff0c; 使用JAAS和JSF进行用户登录验证 &#xff0c; JSF&#xff1a;Converter and Bean Au…

常用的好用的window工具

1. FastStone Capture截图录屏软件 百度软件中心&#xff1a;http://rj.baidu.com/soft/detail/13504.html?ald 注册企业版&#xff1a; 用户名&#xff1a;c1ikm 注册码&#xff1a;AXMQX-RMMMJ-DBHHF-WIHTV 中文输入乱码解决方法&#xff1a; 2. Notepad文本编辑器&#xff…

表分区

http://www.cnblogs.com/leestar54/p/6225821.html转载于:https://www.cnblogs.com/jouny/p/6262850.html

java飞鸽传书_feige 飞鸽传书源代码java 实现不错的联系网络编程的资料飞鸽传书的GUI(java实现) - 下载 - 搜珍网...

我的飞鸽传书/FileFilter.java我的飞鸽传书/FileNameExtensionFilter.java我的飞鸽传书/飞鸽传书/classes/feige/About.class我的飞鸽传书/飞鸽传书/classes/feige/ConnectOthers$ReadMessageThread.class我的飞鸽传书/飞鸽传书/classes/feige/ConnectOthers.class我的飞鸽传书…

JAXB和根元素

XmlRootElement是人们习惯于与JAXB&#xff08;JSR-222&#xff09;一起使用的注释。 目的是将根元素与类唯一关联。 由于JAXB类映射到复杂类型&#xff0c;因此一个类有可能对应于多个根元素。 在这种情况下&#xff0c;无法使用XmlRootElement &#xff0c;人们开始感到有些困…

python socket模块实现udp通信_Python基于socket模块实现UDP通信功能示例

Python基于socket模块实现UDP通信功能示例本文实例讲述了Python基于socket模块实现UDP通信功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;一 代码1、接收端import socket#使用IPV4协议&#xff0c;使用UDP协议传输数据ssocket.socket(socket.AF_INET, socket.SOC…