我正在修一个负责发送电子邮件的班级.它看起来像这样(简化):
/* ... */
Properties props = System.getProperties();
props.put("mail.smtp.host", A_VALID_IP_OF_MAIL_SERVER);
Session session = Session.getDefaultInstance(props, null);
try {
Message msg = new MimeMessage(session);
/* msg.setFrom(); msg.addRecipient(); etc. */
Transport.send(msg);
System.out.println("Sent!");
}
catch (Exception e) { /* ... */ }
/* ... */
Run Code Online (Sandbox Code Playgroud)
在我的工作,我设置session
来null
和我绝对惊喜的类仍然能正常工作.如果我传递null
给MimeMessage
构造函数并不重要.它不会抛出异常或任何东西.此外,该Transport.send()
方法包括以下几行:
240 Session s = (msg.session != null) ? msg.session :
241 Session.getDefaultInstance(System.getProperties(), null);
因此,如果会话是null
它,则只使用系统属性创建一个新会话.那么创建一个Session
对象的目的是什么呢?MimeMessage
如果你传递的内容无关紧要,为什么没有默认的构造函数呢?
我查看了许多使用javax.mail的例子,例如:来自Google的示例和
来自tutorialspoint的示例,他们都创建了一个Session
看似毫无用处的对象.为什么有人这样做?
这篇文章解释了foreach循环直接对应于使用迭代器.如果我写一个foreach循环,它真的会转换成for for iterator?特别是给定的循环:
for(Integer i : createList()){
System.out.println(i);
}
Run Code Online (Sandbox Code Playgroud)
createList()
无论如何,我保证总是只打一次电话吗?它被重写为:
for(Iterator<Integer> i = createList().iterator(); i.hasNext(); ) {
System.out.println(i.next());
}
Run Code Online (Sandbox Code Playgroud)
在某种中间步骤或恰好产生与上述相同的字节码?
我有一个类似于这个问题中描述的情况,我写了一个相同的查询,但是当我尝试将其写为jpql命名查询时,我收到一个错误.
我的查询:
@NamedQuery(
name = "findRankingsBetween",
query = "SELECT rt FROM Rankingtable rt " +
"INNER JOIN " +
"(SELECT teamId, MAX(lastupdate) as MaxDateTime " +
"FROM Rankingtable " +
"GROUP BY teamId) grouped " +
"ON rt.teamId = grouped.teamId " +
"AND rt.lastupdate = grouped.MaxDateTime " +
"WHERE rt.lastupdate BETWEEN :from AND :to"
)
Run Code Online (Sandbox Code Playgroud)
错误:
Error in named query: findRankingsBetween: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: ( near line 1, column 79
Run Code Online (Sandbox Code Playgroud)
如何在jpql中正确编写查询?
java ×3
compilation ×1
foreach ×1
hibernate ×1
jakarta-mail ×1
javax.mail ×1
jpa ×1
jpql ×1
mysql ×1