GVKun编程网logo

JPQL在Select语句中创建新对象-避免还是拥抱?(jpa sql in)

12

对于JPQL在Select语句中创建新对象-避免还是拥抱?感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍jpasqlin,并为您提供关于MySQL:在select语句中自动增加临时列、Orac

对于JPQL在Select语句中创建新对象-避免还是拥抱?感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍jpa sql in,并为您提供关于MySQL:在select语句中自动增加临时列、Oracle SQL – 帮助在Select语句中使用Case、php – 为什么MySQL在SELECT语句中使用RAND()时会返回相同的结果?、php – 可以在SELECT语句中使用单个单词进行SQL注入吗?的有用信息。

本文目录一览:

JPQL在Select语句中创建新对象-避免还是拥抱?(jpa sql in)

JPQL在Select语句中创建新对象-避免还是拥抱?(jpa sql in)

我最近了解到,可以在JPQL语句中创建新的对象,如下所示:

select new Family(mother, mate, offspr)from DomesticCat as mother    join mother.mate as mate    left join mother.kittens as offspr

这是要避免的事情还是应该接受?根据良好实践,何时才可以合理使用此功能?

答案1

小编典典

不要回避它 ,因为有第 10.2.7.2节 所提醒的,因为它有完全有效的用例,所以这里有SELECT NEW EJB 3.0
JPA规范
的SELECT子句 中的 JPQL构造函数表达式

SELECT列表中可以使用构造函数来返回一个或多个Java实例。指定的类不需要是实体,也不必映射到数据库。 构造函数名称必须完全合格。

如果在SELECT NEW子句中指定了实体类名称,则生成的实体实例将处于新状态。

SELECT NEW com.acme.example.CustomerDetails(c.id, c.status, o.count)FROM Customer c JOIN c.orders oWHERE o.count > 100

简而言之,当您不想以类型安全的方式(而不是Object[])检索完整的实体或对象的完整图形时,请使用SELECT NEW
。您将查询结果映射到实体类还是非映射类将取决于您的选择。一个典型的示例是列表屏幕(您可能不需要所有详细信息)。

换句话说,不要在任何地方都使用它,但不要禁止它的使用(很少有东西是黑色或白色的)。

MySQL:在select语句中自动增加临时列

MySQL:在select语句中自动增加临时列

如何解决MySQL:在select语句中自动增加临时列?

这将为您提供一个 行号3

SELECT
    (@cnt := @cnt + 1) AS rowNumber,
    t.rowID
FROM myTable AS t
  CROSS JOIN (SELECT @cnt := 0) AS dummy
WHERE t.CategoryID = 1
ORDER BY t.rowID ;

| ROWNUMBER | ROWID |
---------------------
| 1 | 1 |
| 2 | 25 |
| 3 | 33 |
| 4 | 150 |

解决方法

如何在MySQL的select语句中创建并自动增加临时列?

这是我到目前为止的内容:

SET @cnt = 0;
SELECT
    (@cnt =@cnt + 1) AS rowNumber,rowID
FROM myTable
WHERE CategoryID = 1

哪个返回:

+++++++++++++++++++++
+ rowNumber | rowID +
+++++++++++++++++++++
+  (NULL)   |   1   +
+  (NULL)   |   25  +
+  (NULL)   |   33  +
+  (NULL)   |   150 +
+  (NULL)   |   219 +
+++++++++++++++++++++

但是我需要:

+++++++++++++++++++++
+ rowNumber | rowID +
+++++++++++++++++++++
+  1        |   1   +
+  2        |   25  +
+  3        |   33  +
+  4        |   150 +
+  ...      |   ... +
+++++++++++++++++++++

Oracle SQL – 帮助在Select语句中使用Case

Oracle SQL – 帮助在Select语句中使用Case

CREATE TABLE student_totalexp2 nologging compress AS
SELECT /*+parallel(a,4)*/ disTINCT a.member_sk,CASE 
         WHEN b.end_date IS NULL THEN 
           SYSDATE - MIN(TO_DATE(b.start_date,''yyyymm''))
         ELSE 
           (MAX(TO_DATE(b.end_date,''yyyymm'')) - MIN(TO_DATE(b.start_date,''yyyymm'')))  
       END as days_experience
  FROM student_schools a 
  JOIN rdorwart.position_rd b ON a.member_sk = b.member_sk 
 WHERE days_experience < 730 
 GROUP BY a.member_sk;

SELECT COUNT(*) 
  FROM student_experience;

知道为什么我一直收到这个错误:错误报告:

sql Error: ORA-00904: “DAYS_EXPERIENCE”: invalid identifier 00904. 00000 – “%s: invalid identifier”
*Cause:
*Action:

解决方法

您不能在WHERE子句中引用别名.要么使用子查询,要么更好地使用整个CASE … END到where子句中.

根据OP的评论更新了查询:

create table student_totalexp2 nologging compress as 
SELECT a.member_sk,SUM(CASE WHEN b.end_date IS NULL
    THEN sysdate 
    ELSE to_date(b.end_date,''yyyymm'') 
  END - to_date(b.start_date,''yyyymm'')) as days_experience
FROM student_schools a INNER JOIN rdorwart.position_rd b 
  ON a.member_sk = b.member_sk 
GROUP BY a.member_sk
HAVING SUM(
  CASE WHEN b.end_date IS NULL
    THEN sysdate 
    ELSE to_date(b.end_date,''yyyymm'')
  ) < 730;
SELECT COUNT(*) FROM student_experience;

php – 为什么MySQL在SELECT语句中使用RAND()时会返回相同的结果?

php – 为什么MySQL在SELECT语句中使用RAND()时会返回相同的结果?

我打开了许多浏览器窗口,指向同一个自动刷新的 PHP页面.它访问MysqL数据库以识别过期的客户信息.特别是获取最近一天未更新的记录并强制更新.其余的代码似乎处理得很好.

这是我的MysqLi查询:

$query = "SELECT *
          FROM customers
          WHERE customer_group='consumables' AND customer_updated < DATE_SUB(Now(),INTERVAL 1 DAY)
          ORDER BY RAND()
          LIMIT 10";

我被告知RAND()不是很合适,因为它对大型表的处理速度很慢,但是在这个项目结束之前我的表不会增加到超过20000.我还有一个随机变量传递给URL,如“clientdataupdates.PHP?nocachepls = 1541231”.

所以这是我的问题:在当前的5000多条记录中,如果此脚本同时在多个浏览器窗口中运行,它们将从MysqL返回相同的记录.不可否认,所选记录似乎是随机选取的,但如果查询在同一时间运行,则在所有窗口中返回相同的记录.

我的研究受到以下事实的限制:我一直在寻找的关键词(现在几天)似乎与其他问题有关,例如“PHP MysqL在使用rand()时返回相同的结果”有太多谷歌响应,指向一般使用rand().

虽然我仍然感谢任何帮助,但实际上我更想知道为什么会这样.我对MysqL内部工作原理的了解是有限的,但是就我在PHP和MysqL接口方面的经验而言,我还没有看到类似的事情.

更新:

我还测试了使用ajax函数,该函数包含一个回调函数来重新启动它.每次div内容都是相同的记录 – 但它仍然看起来像随机选择了哪个记录.

<div id='worker1'>worker: waiting..</div>
<div id='worker2'>worker: waiting..</div>
<div id='worker3'>worker: waiting..</div>
<div id='worker4'>worker: waiting..</div>
<div id='worker5'>worker: waiting..</div>
<script>
 function nextWorker(thisWorker){
  setTimeout(function(){ ajaxpage('customerdata_worker.PHP',thisWorker,nextWorker(thisWorker)); },10000);
 }
 setTimeout(nextWorker('worker1'),100);
 setTimeout(nextWorker('worker2'),100);
 setTimeout(nextWorker('worker3'),100);
 setTimeout(nextWorker('worker4'),100);
 setTimeout(nextWorker('worker5'),100);
</script>

解决方法

您可能正在从某些结果集中的MySQL查询缓存中接收信息.

试试这个:

SELECT sql_NO_CACHE *
       /* etc */

注意:将sql_NO_CACHE字放在与SELECT和*(或您选择的第一列的名称)相同的行上.

看到:http://dev.mysql.com/doc/refman/5.1/en/query-cache.html它说,

The query cache stores the text of a SELECT statement together with
the corresponding result that was sent to the client. If an identical
statement is received later,the server retrieves the results from the
query cache rather than parsing and executing the statement again. The
query cache is shared among sessions,so a result set generated by one
client can be sent in response to the same query issued by another
client.

专业提示:避免在软件中使用SELECT *.在结果集中提供所需列的名称.

php – 可以在SELECT语句中使用单个单词进行SQL注入吗?

php – 可以在SELECT语句中使用单个单词进行SQL注入吗?

假设您有一个如下所示的查询:

SELECT * FROM messages WHERE sender='clean_username'

在get / post上收到clean_username并清理的地方如下:

$clean_username = preg_replace( '/[^A-Za-z0-9_]+/m' , '', $dirty_username );

上面的代码删除了任何空格(以及其他内容),这意味着valid_username参数将始终只是一个单词.

注射可以利用这种方法最简单的方法是什么?

我问这个问题是为了更好地理解sql注入的工作原理.在我的工作中,我坚持使用预先准备好的语句和参数化查询以防止注入的既定良好实践,但我认为人们也应该了解如何在这样的简单场景中注入恶意代码.

解决方法:

您仍然可以使用十六进制编码来利用它:剥离空间是不够的.
I guess this is a somewhat interesting place to start.但是考虑到preg_match()es在高流量站点上的性能非常糟糕.

准备语句和参数化查询始终是防止sql注入的最佳方法.

使用十六进制编码并且没有空格的GET注入示例

?id=(1)and(1)=(0)union(select(null),group_concat(column_name),(null)from(information_schema.columns)where(table_name)=(0x7573657273))#

我想你可以看到上面的问题.

今天的关于JPQL在Select语句中创建新对象-避免还是拥抱?jpa sql in的分享已经结束,谢谢您的关注,如果想了解更多关于MySQL:在select语句中自动增加临时列、Oracle SQL – 帮助在Select语句中使用Case、php – 为什么MySQL在SELECT语句中使用RAND()时会返回相同的结果?、php – 可以在SELECT语句中使用单个单词进行SQL注入吗?的相关知识,请在本站进行查询。

本文标签: