Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在hibernate中通过电子邮件获取实体_Java_Mysql_Hibernate - Fatal编程技术网

Java 在hibernate中通过电子邮件获取实体

Java 在hibernate中通过电子邮件获取实体,java,mysql,hibernate,Java,Mysql,Hibernate,我试图从他的电子邮件中获取用户,该电子邮件在数据库中是唯一的 我写这段代码: session.beginTransaction(); User user = (User) session.createQuery("select * from `user` where email = '"+email+"'"); session.getTransaction().commit(); 这个代码对吗?或者hibernate中有一些函数可以按列值获取实体?我发现当前代码存在两个问题。首先,您似乎正

我试图从他的电子邮件中获取用户,该电子邮件在数据库中是唯一的

我写这段代码:

session.beginTransaction();
User user =  (User) session.createQuery("select * from `user`  where email = '"+email+"'");
session.getTransaction().commit();

这个代码对吗?或者hibernate中有一些函数可以按列值获取实体?

我发现当前代码存在两个问题。首先,您似乎正在运行本机SQL查询,而不是HQL(或JPQL)。其次,您的查询是使用字符串连接构建的,这使得它很容易受到SQL注入的攻击

考虑以下代码:

Query query = session.createQuery("from User u where u.email = :email ");
query.setParameter("email", email);
List list = query.list();

不写入任何SQL:

  public static Person getPersonByEmail(String email)  {
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        Session session = sessionFactory.openSession();
        session.beginTransaction();

        CriteriaBuilder cb = session.getCriteriaBuilder();

        CriteriaQuery<Person> cr = cb.createQuery(Person.class);
        Root<Person> root = cr.from(Person.class);
        cr.select(root).where(cb.equal(root.get("email"), email));  //here you pass a class field, not a table column (in this example they are called the same)

        Query<Person> query = session.createQuery(cr);
        query.setMaxResults(1);
        List<Person> result = query.getResultList();
        session.close();

        return result.get(0);
  }

创建查询应该是您正在查找的,除非电子邮件是ID,那么您可以使用
get
。但是请注意,出于安全原因,您不应该简单地将电子邮件放入字符串中。您应该使用参数,如下所述:不,它不对。createQuery需要一个JPQL查询。您传递的不是JPQL。了解JPQL:。还要学习使用查询参数而不是串联,因为您的代码容易受到SQL/JPQL注入攻击。最后,如文档所述,createQuery返回一个查询,而不是用户。您需要使用getResultList()或getSingleResult()执行该查询。事实上,我没有注意到该查询是如何编写的,但
createQuery
仍然是此处使用的方法。事务不仅仅用于原子性。隔离也很重要。在查询返回后能够导航到实体图也很重要。交易总是一个好主意。另外,它应该是
select u from User u…。
带大写字母u,因为这是类名。@JBNizet当我写这篇文章时,我想到的是JDBC,在这种情况下,我们可能不会使用显式事务进行简单的选择,而是用于更新等。我们希望在其中使用回滚选项。是的,Hibernate中DB的每一次命中都可能有一个事务。OP漏掉了这段代码(以及其他一些东西)。谢谢你的回答,但是在Hibernathank you@TimBiegeleisen中使用“Query”类似乎是不推荐的
public static void main(String[] args)  {
  Person person = getPersonByEmail("test@mail.com");
  System.out.println(person.getEmail());  //test@mail.com
}